高仿苹果虚拟home键,手势拖动,放手会弹到屏幕边缘。
生活随笔
收集整理的這篇文章主要介紹了
高仿苹果虚拟home键,手势拖动,放手会弹到屏幕边缘。
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在最近的項(xiàng)目開發(fā)過程中,產(chǎn)品提出了一個(gè)需求,就是要求在屏幕上面有一個(gè)懸浮按鈕,然后手勢可以拖動(dòng),在手抬起的時(shí)候會(huì)回到屏幕邊緣,類似于蘋果的虛擬home鍵。
不多說了,直接上代碼了,代碼里面會(huì)有注釋,可以解釋清楚:整個(gè)Demo只有一個(gè)類,繼承FloatingActionButton:
import android.animation.ObjectAnimator;
import android.content.Context;
import android.support.design.widget.FloatingActionButton;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;import com.rhzt.xgj.util.DisplayUtil;/*** Created by lixuce on 2017/5/8.*/public class DragFloatActionButton extends FloatingActionButton {private int screenWidth;private int screenHeight;private int screenWidthHalf;private int statusHeight;public DragFloatActionButton(Context context) {super(context);init();}public DragFloatActionButton(Context context, AttributeSet attrs) {super(context, attrs);init();}public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init(){//獲取屏幕寬screenWidth= DisplayUtil.getScreenWidth(getContext());screenWidthHalf=screenWidth/2;//屏幕的高screenHeight=DisplayUtil.getScreenHight(getContext());//狀態(tài)欄的高度// 如果狀態(tài)欄可以拖動(dòng) 就獲取狀態(tài)欄的高度 目前設(shè)置成0statusHeight=0;}private int lastX;private int lastY;private boolean isDrag;@Overridepublic boolean onTouchEvent(MotionEvent event) {int rawX = (int) event.getRawX();int rawY = (int) event.getRawY();switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:isDrag=false;getParent().requestDisallowInterceptTouchEvent(true);lastX=rawX;lastY=rawY;break;case MotionEvent.ACTION_MOVE:isDrag=true;//計(jì)算手指移動(dòng)了多少int dx=rawX-lastX;int dy=rawY-lastY;//這里修復(fù)一些華為手機(jī)無法觸發(fā)點(diǎn)擊事件的問題int distance= (int) Math.sqrt(dx*dx+dy*dy);if(distance==0){isDrag=false;break;}float x=getX()+dx;float y=getY()+dy;//檢測是否到達(dá)邊緣 左上右下x=x<0?0:x>screenWidth-getWidth()?screenWidth-getWidth():x;y=y<statusHeight?statusHeight:y+getHeight()>screenHeight?screenHeight-getHeight():y;setX(x);setY(y);lastX=rawX;lastY=rawY;//Log.i("getX="+getX()+";getY="+getY()+";screenHeight="+screenHeight);break;case MotionEvent.ACTION_UP:if(isDrag){//恢復(fù)按壓效果setPressed(false);
// Log.i("getX="+getX()+";screenWidthHalf="+screenWidthHalf);if(rawX>=screenWidthHalf){animate().setInterpolator(new DecelerateInterpolator()).setDuration(500).xBy(screenWidth-getWidth()-getX()).start();}else {ObjectAnimator oa=ObjectAnimator.ofFloat(this,"x",getX(),0);oa.setInterpolator(new DecelerateInterpolator());oa.setDuration(500);oa.start();}}break;}//如果是拖拽則消耗事件,否則正常傳遞即可。你return isDrag || super.onTouchEvent(event);}
}
很簡單就可以實(shí)現(xiàn)效果了,代碼是應(yīng)對我的需求來寫的,你也可以自己來寫,只是一個(gè)思路,希望可以幫到你。
總結(jié)
以上是生活随笔為你收集整理的高仿苹果虚拟home键,手势拖动,放手会弹到屏幕边缘。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉大计算机学院宣讲,计算机科学与技术学院
- 下一篇: 2009年研究生数模竞赛中一道题是跟弹道