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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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个悬浮按钮了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    /**
    * 创建左边悬浮按钮
    */
    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,是因为不想让悬浮按钮一开始就展现出来;我想通过对屏幕的触摸来实现悬浮按钮的渐变显示和渐变隐藏。那么我们还要对图片的渐变效果进行下处理:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    // 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个方法分别来控制悬浮按钮的显示、隐藏:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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触屏事件,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    @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()方法来移除悬浮按钮。

?
1
2
3
4
5
6
7
    @Override
    public void onDestroy(){
        super.onDestroy();
        //在程序退出(Activity销毁)时销毁悬浮窗口
        wm.removeView(leftbtn);
        wm.removeView(rightbtn);
    }

给大家展示下效果图:

下面是程序的完整代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
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;
/**
 * 悬浮按钮实现翻篇效果
 * <a href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@author</a> 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);
    }
}

附上源码:http://www.oschina.net/code/snippet_157182_8608

Android用悬浮按钮实现翻页效果相关推荐

  1. android 辅助功能 翻页,Android利用悬浮按钮实现翻页效果

    今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子. 首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams.那么在An ...

  2. android 电子书源码,翻页效果

    这两天模仿着做了一个apk电子书的应用,有翻页效果,本来是想学一下自己写的,无奈,最后偷懒使用了别人写的 翻页类 PageWidget.java 下面是工程文件的结构 这个是写的类的包结构,PageV ...

  3. QT qtablewidget按钮控制翻页效果

    主要借鉴别人的思路 pro #------------------------------------------------

  4. Android之实现上下左右翻页效果

    如果实现上下或者左右翻页效果,我们借助下这个开源项目:https://github.com/openaphid/android-flip Aphid FlipView是一个能够实现Flipboard翻 ...

  5. android 仿真翻页动画,Android 两Activity之间动画效果(1)---------翻页效果

    用Android rotate动画实现翻页效果,效果如图: 要实现上面动画,首先搞明白rotate动画原理: (1)Degrees坐标: 0度(360度) 270度 90度  顺时针旋转 180 (2 ...

  6. android做题imageview缩放,巧用ViewPager实现驾考宝典做题翻页效果

    效果如下所示: 思路: a.利用ViewPager自带的动画效果,略作修改,实现滑动覆盖翻页效果. b.移动时加入阴影效果. 1.关键代码如下所示: public class ReaderViewPa ...

  7. linux+手机+翻页,在Android手机上实现阅读器的翻页效果

    本篇文章来谈谈怎么使用java实现翻页效果,就像电子阅读器那样. 现在先来看看翻页的原理图: 先了解各个字母表示的含义: A-把书页翻起来后看到的背面区域 B-把书页翻起来后看到的下一页的一角 C-当 ...

  8. android 右侧点击翻页,巧用ViewPager实现驾考宝典做题翻页效果

    效果如下所示: 思路: a.利用ViewPager自带的动画效果,略作修改,实现滑动覆盖翻页效果. b.移动时加入阴影效果. 1.关键代码如下所示: public class ReaderViewPa ...

  9. android 阅读器自动滚动,在Android手机上实现阅读器翻页效果.doc

    在Android手机上实现阅读器翻页效果 先了解各个字母表示的含义:A-把书页翻起来后看到的背面区域B-把书页翻起来后看到的下一页的一角C-当前页的可见部分.a-手指滑动页角到达的位置b-当前页翻起来 ...

  10. android控件翻书效果,android ViewPager实现滑动翻页效果实例代码

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下:import android.content.Context;import androi ...

最新文章

  1. 旋转框检测方法综述:RotateAnchor系列
  2. 使用Python中的卷积神经网络进行恶意软件检测
  3. 25Interpreter(解析器)模式
  4. 多层感知机MLP常见的超参数有哪些?如果MLP模型对于数据集过拟合了,如何调整这些超参数来进行解决?
  5. Windows上打开大文件的工具
  6. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)
  7. 禁用Cookie在web浏览器中读取/写入c#应用程序
  8. Bootstrap 3之美02-Grid简介和应用
  9. 【Tensorflow】更新后报错 numpy.core.umath
  10. 第一天docker入门
  11. [ Typescript 手册] JavaScript `Date` 在 Typescript 中的接口
  12. Apache下的FileUtils.listFiles方法简单使用技巧
  13. ScrollView-图片的放大缩小
  14. shell脚本加密工具—shc
  15. python 抢票_亲测,python抢票成功!
  16. 绕过TrustedInstaller权限
  17. 利用sublime3 + xmapp使用服务器调试
  18. ecshop分销说明
  19. SitePoint播客#126:蛋黄在我们身上
  20. Spring MVC各组件近距离接触--下下--05

热门文章

  1. LLVM编译技术应用分析
  2. shiny | 使用R创建一个网页应用(Web App)
  3. java中的tld_自定义标签tld的使用
  4. Python北京二手房房价数据集分析
  5. python数据分析怎么画_跟小白学Python数据分析——绘制维恩图
  6. springmvc+mybatis环境搭建遇到的错误
  7. iView组件+Django实现前后端分离上传图片
  8. springmvc防xss脚本注入攻击,springmvc过滤html和js标签,html和js标签转义
  9. ubuntu apt-get install更新域名解析失败问题的处理方法
  10. Python(十)函数