打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android用悬浮按钮实现翻页效果

Android用悬浮按钮实现翻页效果

您的评价:
     

今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子。

首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的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);    }

给大家展示下效果图:



下面是程序的完整代码:

package com.liux.pageflipper;import android.app.Activity;import android.graphics.PixelFormat;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.view.WindowManager.LayoutParams;import android.widget.ImageView;import android.widget.ViewFlipper;/** * 悬浮按钮实现翻篇效果 * @author liux  http://my.oschina.net/liux * @date 2012-2-10 下午2:48:52 */public class PageFlipperActivity extends Activity{	    private WindowManager wm=null;    private WindowManager.LayoutParams wmParams=null;	    private ImageView leftbtn=null;    private ImageView rightbtn=null;	    // ImageView的alpha值       private int mAlpha = 0;    private boolean isHide;	    private ViewFlipper viewFlipper = null;	    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                viewFlipper = (ViewFlipper) this.findViewById(R.id.myViewFlipper);                //初始化悬浮按钮         initFloatView();        }    /**     * 初始化悬浮按钮     */    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;    	        //创建悬浮按钮         createLeftFloatView();        createRightFloatView();    }        /**     * 创建左边悬浮按钮     */    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) {		//上一篇		viewFlipper.setInAnimation(PageFlipperActivity.this, R.anim.in_leftright);		viewFlipper.setOutAnimation(PageFlipperActivity.this, R.anim.out_leftright);		viewFlipper.showPrevious();	    }	});    	//调整悬浮窗口          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) {		//下一篇		viewFlipper.setInAnimation(PageFlipperActivity.this, R.anim.in_rightleft);		viewFlipper.setOutAnimation(PageFlipperActivity.this, R.anim.out_rightleft);		viewFlipper.showNext();	    }	});    	//调整悬浮窗口          wmParams.gravity=Gravity.RIGHT|Gravity.CENTER_VERTICAL;         //显示myFloatView图像          wm.addView(rightbtn, wmParams);    }    /**     * 图片渐变显示处理     */    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);	    }				}    };	    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();    }        @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;    }    @Override    public void onDestroy(){    	super.onDestroy();    	//在程序退出(Activity销毁)时销毁悬浮窗口    	wm.removeView(leftbtn);    	wm.removeView(rightbtn);    }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android中可自由移动悬浮窗口的实现 | xsmile's Blog
在Android中使用WindowManager实现悬浮窗口
Android开发之WindowManager详解
Android中在界面上动态显示歌词
Android6.0系统悬浮窗权限的问题解决方法
android悬浮窗口的实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服