服务器之家

服务器之家 > 正文

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

时间:2021-04-25 15:11     来源/作者:安卓开发网

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

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

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

下面是程序的完整代码:

?
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
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);
  }
}

以上内容是小编给大家分享的android利用悬浮按钮实现翻页效果,希望大家喜欢。

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
返回顶部