zoukankan      html  css  js  c++  java
  • 悬浮按钮

    http://www.oschina.net/question/157182_37944

    http://www.oschina.net/code/snippet_157182_8608

    首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams。那么在AndroidManifest.xml中添加权限:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    然后,我们要对WindowManager,WindowManager.LayoutParams的相关属性进行下设置:

    private WindowManager wm=null;
    private WindowManager.LayoutParams wmParams=null;
    
    private void initFloatView(){
        //获取WindowManager
        wm=(WindowManager)getApplicationContext().getSystemService("window");
        //设置LayoutParams(全局变量)相关参数
         wmParams = new WindowManager.LayoutParams();
        	
        wmParams.type=LayoutParams.TYPE_PHONE;   //设置window type
        wmParams.format=PixelFormat.RGBA_8888;   //设置图片格式,效果为背景透明
         //设置Window flag
        wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL 
                         | LayoutParams.FLAG_NOT_FOCUSABLE;
    
        //以屏幕左上角为原点,设置x、y初始值
         wmParams.x=0;
        wmParams.y=0;
        //设置悬浮窗口长宽数据
         wmParams.width=50;
        wmParams.height=50;
    }

    通过WindowManager的addView方法创建的View可以实现悬浮窗口效果!因此,我们需要为屏幕创建2个悬浮按钮了。

        /**
        * 创建左边悬浮按钮
        */
        private void createLeftFloatView(){
        	leftbtn=new ImageView(this);
        	leftbtn.setImageResource(R.drawable.prev);
        	leftbtn.setAlpha(0);
        	leftbtn.setOnClickListener(new View.OnClickListener() {	
    		public void onClick(View arg0) {
    			//上一篇
    		}
    	});
        	//调整悬浮窗口
            wmParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;
            //显示myFloatView图像
            wm.addView(leftbtn, wmParams);
        }
        /**
        * 创建右边悬浮按钮
        */
        private void createRightFloatView(){
        	rightbtn=new ImageView(this);
        	rightbtn.setImageResource(R.drawable.next);
        	rightbtn.setAlpha(0);
        	rightbtn.setOnClickListener(new View.OnClickListener() {	
    		public void onClick(View arg0) {
    			//下一篇
    		}
    	});
        	//调整悬浮窗口
            wmParams.gravity=Gravity.RIGHT|Gravity.CENTER_VERTICAL;
            //显示myFloatView图像
            wm.addView(rightbtn, wmParams);
        }

    我把图片的Alpha值设置为0,是因为不想让悬浮按钮一开始就展现出来;我想通过对屏幕的触摸来实现悬浮按钮的渐变显示和渐变隐藏。那么我们还要对图片的渐变效果进行下处理:

        // ImageView的alpha值   
        private int mAlpha = 0;
        private boolean isHide;
        /**
         * 图片渐变显示处理
         */
        private Handler mHandler = new Handler()
        {
    	public void handleMessage(Message msg) {
    	    if(msg.what==1 && mAlpha<255){   
    		//System.out.println("---"+mAlpha);					
    		mAlpha += 50;
    		if(mAlpha>255)
    		    mAlpha=255;
    	         leftbtn.setAlpha(mAlpha);
    	         leftbtn.invalidate();
    	         rightbtn.setAlpha(mAlpha);
    	         rightbtn.invalidate();
    		if(!isHide && mAlpha<255)
    		    mHandler.sendEmptyMessageDelayed(1, 100);
    	    }else if(msg.what==0 && mAlpha>0){
    		//System.out.println("---"+mAlpha);
    		mAlpha -= 10;
    		if(mAlpha<0)
    		    mAlpha=0;
    		leftbtn.setAlpha(mAlpha);
    		leftbtn.invalidate();
    		rightbtn.setAlpha(mAlpha);
    		rightbtn.invalidate();
    		if(isHide && mAlpha>0)
    		    mHandler.sendEmptyMessageDelayed(0, 100);
    	    }			
    	}
        };

    我们再用2个方法分别来控制悬浮按钮的显示、隐藏:

        private void showFloatView(){
        	isHide = false;
        	mHandler.sendEmptyMessage(1);
        }
        
        private void hideFloatView(){
    	new Thread(){
    	    public void run() {
    		try {
    	               Thread.sleep(1500);
    	               isHide = true;
    	               mHandler.sendEmptyMessage(0);
    	         } catch (Exception e) {
    	                ;
    	         }
    	    }
    	}.start();
        }

    这里为了不让悬浮按钮显示后,马上就开始隐藏。我使用了一个线程,先暂停1.5秒钟,再开始渐变隐藏。
    接下来,我要重写Activity的onTouchEvent触屏事件,代码如下:

        @Override
        public boolean onTouchEvent(MotionEvent event) {
        	switch (event.getAction()) {
        	    case MotionEvent.ACTION_MOVE:
    	    case MotionEvent.ACTION_DOWN:
    		//System.out.println("========ACTION_DOWN");
    		showFloatView();			
    		break;
    	    case MotionEvent.ACTION_UP:
    		//System.out.println("========ACTION_UP");
    		hideFloatView();				
    		break;
    	}
    	return true;
        }

    最后,要在Activity销毁时销毁悬浮按钮,不然悬浮按钮会一直悬浮在那。因此,我们要再重写Activity的onDestroy()方法,并调用WindowManager的removeView()方法来移除悬浮按钮。

        @Override
        public void onDestroy(){
        	super.onDestroy();
        	//在程序退出(Activity销毁)时销毁悬浮窗口
        	wm.removeView(leftbtn);
        	wm.removeView(rightbtn);
        }
  • 相关阅读:
    do you believe it?
    Linux+Mono+Asp.net入门:00软件下载地址
    《行动英雄》李嘉诚讲演
    Js全局和局部变量_this关键字_《没有控件的ASPDONET》
    教学相长
    基于多线程和SOCKET的聊天室(原创附源码)【没有控件的ASP.NET】
    程序员学好英语啊
    SQL行列转换:报表_公司采购表_每个公司各采购了些什么产品
    关于文件后缀名的误解
    Linux+Mono+Asp.net入门+Asp.net:01.虚拟机安装
  • 原文地址:https://www.cnblogs.com/kobe8/p/3193418.html
Copyright © 2011-2022 走看看