Android利用懸浮按鈕實(shí)現(xiàn)翻頁效果
今天給大家分享下自己用懸浮按鈕點(diǎn)擊實(shí)現(xiàn)翻頁效果的例子。
首先,一個(gè)按鈕要實(shí)現(xiàn)懸浮,就要用到系統(tǒng)頂級窗口相關(guān)的WindowManager,WindowManager.LayoutParams。那么在AndroidManifest.xml中添加權(quán)限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
然后,我們要對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è)置懸浮窗口長寬數(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)出來;我想通過對屏幕的觸摸來實(shí)現(xiàn)懸浮按鈕的漸變顯示和漸變隱藏。那么我們還要對圖片的漸變效果進(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); } } };
我們再用2個(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è)置懸浮窗口長寬數(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)翻頁效果,希望大家喜歡。
- Android 中使用RecyclerView實(shí)現(xiàn)底部翻頁
- android中圖片翻頁效果簡單的實(shí)現(xiàn)方法
- 解析Android中實(shí)現(xiàn)滑動(dòng)翻頁之ViewFlipper的使用詳解
- Android實(shí)現(xiàn)閱讀APP平移翻頁效果
- android ViewPager實(shí)現(xiàn)滑動(dòng)翻頁效果實(shí)例代碼
- Android自定義左右或上下滑動(dòng)翻頁效果
- 基于Android實(shí)現(xiàn)3D翻頁效果
- Android?ViewPager實(shí)現(xiàn)左右滑動(dòng)翻頁效果
- Android 仿日歷翻頁、仿htc時(shí)鐘翻頁、數(shù)字翻頁切換效果
- Android通過手勢實(shí)現(xiàn)答題器翻頁效果
- RecyclerView+PagerSnapHelper實(shí)現(xiàn)抖音首頁翻頁的Viewpager效果
相關(guān)文章
Android sd卡讀取數(shù)據(jù)庫實(shí)例代碼
這篇文章主要介紹了Android sd卡讀取數(shù)據(jù)庫實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Android開發(fā)雙向滑動(dòng)選擇器范圍SeekBar實(shí)現(xiàn)
這篇文章主要為大家介紹了Android開發(fā)雙向滑動(dòng)范圍選擇器SeekBar實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android中Fragment與Activity的生命周期對比
這篇文章主要介紹了Android中Fragment與Activity的生命周期對比,Fragment是在Activity的基礎(chǔ)之上進(jìn)行設(shè)計(jì)的,比Activity多出幾個(gè)控制生命周期的回調(diào)函數(shù),需要的朋友可以參考下2016-02-02Android使用Notification實(shí)現(xiàn)通知功能
這篇文章主要為大家詳細(xì)介紹了Android使用Notification實(shí)現(xiàn)通知功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Android開發(fā)中Activity之間切換出現(xiàn)短暫黑屏的解決方法
這篇文章主要介紹了Android開發(fā)中Activity之間切換出現(xiàn)短暫黑屏的解決方法,較為詳細(xì)的分析了Android中Activity之間切換出現(xiàn)短暫黑屏的原因與解決方法,需要的朋友可以參考下2016-02-02Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài)
獲取網(wǎng)絡(luò)信息需要在AndroidManifest.xml文件中加入相應(yīng)的權(quán)限,接下來詳細(xì)介紹Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài),感興趣的朋友可以參考下2012-12-12Android實(shí)現(xiàn)單頁顯示3個(gè)Item的ViewPager炫酷切換效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)單頁顯示3個(gè)Item的ViewPager炫酷切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10