Android利用懸浮按鈕實(shí)現(xiàn)翻頁(yè)效果
今天給大家分享下自己用懸浮按鈕點(diǎn)擊實(shí)現(xiàn)翻頁(yè)效果的例子。
首先,一個(gè)按鈕要實(shí)現(xiàn)懸浮,就要用到系統(tǒng)頂級(jí)窗口相關(guān)的WindowManager,WindowManager.LayoutParams。那么在AndroidManifest.xml中添加權(quán)限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
然后,我們要對(duì)WindowManager,WindowManager.LayoutParams的相關(guān)屬性進(jìn)行下設(shè)置:
private WindowManager wm=null;
private WindowManager.LayoutParams wmParams=null;
private void initFloatView(){
//獲取WindowManager
wm=(WindowManager)getApplicationContext().getSystemService("window");
//設(shè)置LayoutParams(全局變量)相關(guān)參數(shù)
wmParams = new WindowManager.LayoutParams();
wmParams.type=LayoutParams.TYPE_PHONE; //設(shè)置window type
wmParams.format=PixelFormat.RGBA_8888; //設(shè)置圖片格式,效果為背景透明
//設(shè)置Window flag
wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
//以屏幕左上角為原點(diǎn),設(shè)置x、y初始值
wmParams.x=0;
wmParams.y=0;
//設(shè)置懸浮窗口長(zhǎng)寬數(shù)據(jù)
wmParams.width=50;
wmParams.height=50;
}
通過WindowManager的addView方法創(chuàng)建的View可以實(shí)現(xiàn)懸浮窗口效果!因此,我們需要為屏幕創(chuàng)建2個(gè)懸浮按鈕了。
/**
* 創(chuàng)建左邊懸浮按鈕
*/
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) {
//上一篇
}
});
//調(diào)整懸浮窗口
wmParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;
//顯示myFloatView圖像
wm.addView(leftbtn, wmParams);
}
/**
* 創(chuàng)建右邊懸浮按鈕
*/
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) {
//下一篇
}
});
//調(diào)整懸浮窗口
wmParams.gravity=Gravity.RIGHT|Gravity.CENTER_VERTICAL;
//顯示myFloatView圖像
wm.addView(rightbtn, wmParams);
}
我把圖片的Alpha值設(shè)置為0,是因?yàn)椴幌胱寫腋“粹o一開始就展現(xiàn)出來;我想通過對(duì)屏幕的觸摸來實(shí)現(xiàn)懸浮按鈕的漸變顯示和漸變隱藏。那么我們還要對(duì)圖片的漸變效果進(jìn)行下處理:
// 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);
}
}
};
我們?cè)儆?個(gè)方法分別來控制懸浮按鈕的顯示、隱藏:
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();
}
這里為了不讓懸浮按鈕顯示后,馬上就開始隱藏。我使用了一個(gè)線程,先暫停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銷毀時(shí)銷毀懸浮按鈕,不然懸浮按鈕會(huì)一直懸浮在那。因此,我們要再重寫Activity的onDestroy()方法,并調(diào)用WindowManager的removeView()方法來移除懸浮按鈕。
@Override
public void onDestroy(){
super.onDestroy();
//在程序退出(Activity銷毀)時(shí)銷毀懸浮窗口
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;
/**
* 懸浮按鈕實(shí)現(xiàn)翻篇效果
* <a 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");
//設(shè)置LayoutParams(全局變量)相關(guān)參數(shù)
wmParams = new WindowManager.LayoutParams();
wmParams.type=LayoutParams.TYPE_PHONE; //設(shè)置window type
wmParams.format=PixelFormat.RGBA_8888; //設(shè)置圖片格式,效果為背景透明
//設(shè)置Window flag
wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
//以屏幕左上角為原點(diǎn),設(shè)置x、y初始值
wmParams.x=0;
wmParams.y=0;
//設(shè)置懸浮窗口長(zhǎng)寬數(shù)據(jù)
wmParams.width=50;
wmParams.height=50;
//創(chuàng)建懸浮按鈕
createLeftFloatView();
createRightFloatView();
}
/**
* 創(chuàng)建左邊懸浮按鈕
*/
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();
}
});
//調(diào)整懸浮窗口
wmParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;
//顯示myFloatView圖像
wm.addView(leftbtn, wmParams);
}
/**
* 創(chuàng)建右邊懸浮按鈕
*/
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();
}
});
//調(diào)整懸浮窗口
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銷毀)時(shí)銷毀懸浮窗口
wm.removeView(leftbtn);
wm.removeView(rightbtn);
}
}
以上內(nèi)容是小編給大家分享的Android利用懸浮按鈕實(shí)現(xiàn)翻頁(yè)效果,希望大家喜歡。
- Android 中使用RecyclerView實(shí)現(xiàn)底部翻頁(yè)
- android中圖片翻頁(yè)效果簡(jiǎn)單的實(shí)現(xiàn)方法
- 解析Android中實(shí)現(xiàn)滑動(dòng)翻頁(yè)之ViewFlipper的使用詳解
- Android實(shí)現(xiàn)閱讀APP平移翻頁(yè)效果
- android ViewPager實(shí)現(xiàn)滑動(dòng)翻頁(yè)效果實(shí)例代碼
- Android自定義左右或上下滑動(dòng)翻頁(yè)效果
- 基于Android實(shí)現(xiàn)3D翻頁(yè)效果
- Android?ViewPager實(shí)現(xiàn)左右滑動(dòng)翻頁(yè)效果
- Android 仿日歷翻頁(yè)、仿htc時(shí)鐘翻頁(yè)、數(shù)字翻頁(yè)切換效果
- Android通過手勢(shì)實(shí)現(xiàn)答題器翻頁(yè)效果
- RecyclerView+PagerSnapHelper實(shí)現(xiàn)抖音首頁(yè)翻頁(yè)的Viewpager效果
相關(guān)文章
Android發(fā)送GET與POST請(qǐng)求的DEMO詳解
本篇文章是對(duì)Android發(fā)送GET與POST請(qǐng)求的DEMO進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Android通知欄微技巧一些需要注意的小細(xì)節(jié)
這篇文章主要介紹了Android通知欄微技巧,那些你所沒關(guān)注過的小細(xì)節(jié),小編把此文分享到腳本之家平臺(tái),需要的朋友可以參考下2018-04-04
Android開發(fā)在RecyclerView上面實(shí)現(xiàn)"拖放"和"滑動(dòng)刪除"-2
這篇文章主要介紹了Android開發(fā)在RecyclerView上面實(shí)現(xiàn)"拖放"和"滑動(dòng)刪除"(二)功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
解析android創(chuàng)建快捷方式會(huì)啟動(dòng)兩個(gè)應(yīng)用的問題
本篇文章是對(duì)關(guān)于android創(chuàng)建快捷方式會(huì)啟動(dòng)兩個(gè)應(yīng)用的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
詳解Android使用Handler造成內(nèi)存泄露的分析及解決方法
這篇文章主要介紹了詳解Android使用Handler造成內(nèi)存泄露的分析及解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
Android實(shí)現(xiàn)圖片異步加載并緩存到本地
這篇文章主要介紹了Android實(shí)現(xiàn)圖片異步加載并緩存到本地的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android串口開發(fā)之使用JNI實(shí)現(xiàn)ANDROID和串口通信詳解
這篇文章主要給大家介紹了關(guān)于Android串口開發(fā)之使用JNI實(shí)現(xiàn)ANDROID和串口通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01

