当前位置: 移动技术网 > IT编程>移动开发>Android > Android利用悬浮按钮实现翻页效果

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

赵慈靓,315曝光汽车,在线翻译google

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

首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的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;
/**
 * 悬浮按钮实现翻篇效果
 * <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利用悬浮按钮实现翻页效果,希望大家喜欢。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网