原文地址 http://www.open-open.com/lib/view/open1328883424280.html
今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子。
首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams。那么在AndroidManifest.xml中添加权限:
1 | < uses-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW" /> |
然后,我们要对WindowManager,WindowManager.LayoutParams的相关属性进行下设置:
01 | private WindowManager wm= null ; |
02 | private WindowManager.LayoutParams wmParams= null ; |
04 | private void initFloatView(){ |
06 | wm=(WindowManager)getApplicationContext().getSystemService( "window" ); |
08 | wmParams = new WindowManager.LayoutParams(); |
10 | wmParams.type=LayoutParams.TYPE_PHONE; |
11 | wmParams.format=PixelFormat.RGBA_8888; |
13 | wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
14 | | LayoutParams.FLAG_NOT_FOCUSABLE; |
通过WindowManager的addView方法创建的View可以实现悬浮窗口效果!因此,我们需要为屏幕创建2个悬浮按钮了。
04 | private void createLeftFloatView(){ |
05 | leftbtn= new ImageView( this ); |
06 | leftbtn.setImageResource(R.drawable.prev); |
08 | leftbtn.setOnClickListener( new View.OnClickListener() { |
09 | public void onClick(View arg0) { |
14 | wmParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL; |
16 | wm.addView(leftbtn, wmParams); |
21 | private void createRightFloatView(){ |
22 | rightbtn= new ImageView( this ); |
23 | rightbtn.setImageResource(R.drawable.next); |
25 | rightbtn.setOnClickListener( new View.OnClickListener() { |
26 | public void onClick(View arg0) { |
31 | wmParams.gravity=Gravity.RIGHT|Gravity.CENTER_VERTICAL; |
33 | wm.addView(rightbtn, wmParams); |
我把图片的Alpha值设置为0,是因为不想让悬浮按钮一开始就展现出来;我想通过对屏幕的触摸来实现悬浮按钮的渐变显示和渐变隐藏。那么我们还要对图片的渐变效果进行下处理:
02 | private int mAlpha = 0 ; |
03 | private boolean isHide; |
07 | private Handler mHandler = new Handler() |
09 | public void handleMessage(Message msg) { |
10 | if (msg.what== 1 && mAlpha< 255 ){ |
15 | leftbtn.setAlpha(mAlpha); |
17 | rightbtn.setAlpha(mAlpha); |
18 | rightbtn.invalidate(); |
19 | if (!isHide && mAlpha< 255 ) |
20 | mHandler.sendEmptyMessageDelayed( 1 , 100 ); |
21 | } else if (msg.what== 0 && mAlpha> 0 ){ |
26 | leftbtn.setAlpha(mAlpha); |
28 | rightbtn.setAlpha(mAlpha); |
29 | rightbtn.invalidate(); |
30 | if (isHide && mAlpha> 0 ) |
31 | mHandler.sendEmptyMessageDelayed( 0 , 100 ); |
我们再用2个方法分别来控制悬浮按钮的显示、隐藏:
01 | private void showFloatView(){ |
03 | mHandler.sendEmptyMessage( 1 ); |
06 | private void hideFloatView(){ |
12 | mHandler.sendEmptyMessage( 0 ); |
13 | } catch (Exception e) { |
这里为了不让悬浮按钮显示后,马上就开始隐藏。我使用了一个线程,先暂停1.5秒钟,再开始渐变隐藏。
接下来,我要重写Activity的onTouchEvent触屏事件,代码如下:
03 | public boolean onTouchEvent(MotionEvent event) { |
04 | switch (event.getAction()) { |
05 | case MotionEvent.ACTION_MOVE: |
06 | case MotionEvent.ACTION_DOWN: |
10 | case MotionEvent.ACTION_UP: |
最后,要在Activity销毁时销毁悬浮按钮,不然悬浮按钮会一直悬浮在那。因此,我们要再重写Activity的onDestroy()方法,并调用WindowManager的removeView()方法来移除悬浮按钮。
2 | public void onDestroy(){ |
5 | wm.removeView(leftbtn); |
6 | wm.removeView(rightbtn); |
给大家展示下效果图:
下面是程序的完整代码:
001 | package com.liux.pageflipper; |
003 | import android.app.Activity; |
004 | import android.graphics.PixelFormat; |
005 | import android.os.Bundle; |
006 | import android.os.Handler; |
007 | import android.os.Message; |
008 | import android.view.Gravity; |
009 | import android.view.MotionEvent; |
010 | import android.view.View; |
011 | import android.view.WindowManager; |
012 | import android.view.WindowManager.LayoutParams; |
013 | import android.widget.ImageView; |
014 | import android.widget.ViewFlipper; |
017 | * <a href="http://my.oschina.net/arthor" rel="nofollow" target="_blank">@author</a> liux http://my.oschina.net/liux |
018 | * @date 2012-2-10 下午2:48:52 |
020 | public class PageFlipperActivity extends Activity{ |
022 | private WindowManager wm= null ; |
023 | private WindowManager.LayoutParams wmParams= null ; |
025 | private ImageView leftbtn= null ; |
026 | private ImageView rightbtn= null ; |
029 | private int mAlpha = 0 ; |
030 | private boolean isHide; |
032 | private ViewFlipper viewFlipper = null ; |
035 | public void onCreate(Bundle savedInstanceState) { |
036 | super .onCreate(savedInstanceState); |
037 | setContentView(R.layout.main); |
039 | viewFlipper = (ViewFlipper) this .findViewById(R.id.myViewFlipper); |
048 | private void initFloatView(){ |
050 | wm=(WindowManager)getApplicationContext().getSystemService( "window" ); |
052 | wmParams = new WindowManager.LayoutParams(); |
054 | wmParams.type=LayoutParams.TYPE_PHONE; |
055 | wmParams.format=PixelFormat.RGBA_8888; |
057 | wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
058 | | LayoutParams.FLAG_NOT_FOCUSABLE; |
068 | createLeftFloatView(); |
069 | createRightFloatView(); |
076 | private void createLeftFloatView(){ |
077 | leftbtn= new ImageView( this ); |
078 | leftbtn.setImageResource(R.drawable.prev); |
080 | leftbtn.setOnClickListener( new View.OnClickListener() { |
081 | public void onClick(View arg0) { |
083 | viewFlipper.setInAnimation(PageFlipperActivity. this , R.anim.in_leftright); |
084 | viewFlipper.setOutAnimation(PageFlipperActivity. this , R.anim.out_leftright); |
085 | viewFlipper.showPrevious(); |
089 | wmParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL; |
091 | wm.addView(leftbtn, wmParams); |
096 | private void createRightFloatView(){ |
097 | rightbtn= new ImageView( this ); |
098 | rightbtn.setImageResource(R.drawable.next); |
099 | rightbtn.setAlpha( 0 ); |
100 | rightbtn.setOnClickListener( new View.OnClickListener() { |
101 | public void onClick(View arg0) { |
103 | viewFlipper.setInAnimation(PageFlipperActivity. this , R.anim.in_rightleft); |
104 | viewFlipper.setOutAnimation(PageFlipperActivity. this , R.anim.out_rightleft); |
105 | viewFlipper.showNext(); |
109 | wmParams.gravity=Gravity.RIGHT|Gravity.CENTER_VERTICAL; |
111 | wm.addView(rightbtn, wmParams); |
116 | private Handler mHandler = new Handler() |
118 | public void handleMessage(Message msg) { |
120 | if (msg.what== 1 && mAlpha< 255 ){ |
125 | leftbtn.setAlpha(mAlpha); |
126 | leftbtn.invalidate(); |
127 | rightbtn.setAlpha(mAlpha); |
128 | rightbtn.invalidate(); |
129 | if (!isHide && mAlpha< 255 ) |
130 | mHandler.sendEmptyMessageDelayed( 1 , 100 ); |
131 | } else if (msg.what== 0 && mAlpha> 0 ){ |
136 | leftbtn.setAlpha(mAlpha); |
137 | leftbtn.invalidate(); |
138 | rightbtn.setAlpha(mAlpha); |
139 | rightbtn.invalidate(); |
140 | if (isHide && mAlpha> 0 ) |
141 | mHandler.sendEmptyMessageDelayed( 0 , 100 ); |
147 | private void showFloatView(){ |
149 | mHandler.sendEmptyMessage( 1 ); |
152 | private void hideFloatView(){ |
158 | mHandler.sendEmptyMessage( 0 ); |
159 | } catch (Exception e) { |
167 | public boolean onTouchEvent(MotionEvent event) { |
168 | switch (event.getAction()) { |
169 | case MotionEvent.ACTION_MOVE: |
170 | case MotionEvent.ACTION_DOWN: |
174 | case MotionEvent.ACTION_UP: |
183 | public void onDestroy(){ |
186 | wm.removeView(leftbtn); |
187 | wm.removeView(rightbtn); |