Android自定義View實(shí)現(xiàn)自動(dòng)吸附功能
本文實(shí)例為大家分享了Android實(shí)現(xiàn)自動(dòng)吸附功能的具體代碼,供大家參考,具體內(nèi)容如下
1.簡(jiǎn)述
最近開發(fā)app過程中要實(shí)現(xiàn)拖動(dòng)view后要可以自動(dòng)吸附功能,所以需要自定義view來(lái)在onTouchEvent中來(lái)利用動(dòng)畫來(lái)實(shí)現(xiàn)此功能
2.功能代碼部分
import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; public class AdsorbentViews extends ImageView { private int maxWidth; private int maxHeight; private int viewWidth; private int viewHeight; private float downx; private float downy; private Context mContext; public CustomViews(Context context) { this(context, null); } public CustomViews(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomViews(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); DisplayMetrics outMetrics = new DisplayMetrics(); WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); windowManager.getDefaultDisplay().getRealMetrics(outMetrics); //屏幕的寬度 maxWidth = outMetrics.widthPixels; //屏幕的高度 maxHeight = outMetrics.heightPixels; /** * 控件的寬高 */ viewWidth = canvas.getWidth(); viewHeight = canvas.getHeight(); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: clearAnimation(); downx = event.getX(); downy = event.getY(); return true; case MotionEvent.ACTION_MOVE: float moveX = event.getRawX() - downx; float moveY = event.getRawY() - downy; moveX = moveX < 0 ? 0 : (moveX + viewWidth > maxWidth) ? (maxWidth - viewWidth) : moveX; moveY = moveY < 0 ? 0 : (moveY + viewHeight) > maxHeight ? (maxHeight - viewHeight) : moveY; this.setY(moveY); this.setX(moveX); return true; case MotionEvent.ACTION_UP: //做吸附效果 float centerX = getX() + viewWidth / 2; if (centerX > maxWidth/2){ //靠右吸附 animate().setInterpolator(new DecelerateInterpolator()) .setDuration(500) .x(maxWidth-viewWidth) .y(maxHeight-viewHeight) .start(); }else { animate().setInterpolator(new DecelerateInterpolator()) .setDuration(500) .x(0) .y(maxHeight-viewHeight) .start(); } return true; default: return super.onTouchEvent(event); } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android Kotlin開發(fā)實(shí)例(Hello World!)及語(yǔ)法詳解
這篇文章主要介紹了Android Kotlin開發(fā)實(shí)例及語(yǔ)法詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05Android中使用Gradle來(lái)構(gòu)建App項(xiàng)目的入門指南
Gradle是Java世界中一個(gè)高人氣自動(dòng)化構(gòu)建工具,在安卓開發(fā)領(lǐng)域同樣備受追捧,這里為大家?guī)?lái)Android中使用Gradle來(lái)構(gòu)建App項(xiàng)目的入門指南,來(lái)看看Gradle的作用與基本結(jié)構(gòu).2016-06-06教你制作Android中炫酷的ViewPagerIndicator(不僅仿MIUI)
ViewPagerIndicator作為一款分頁(yè)指標(biāo)小部件兼容ViewPager,封裝上做得非常不錯(cuò),目前已為眾多知名應(yīng)用所使用。今天給你大家分享一個(gè)炫酷的效果,有需要的可以參考學(xué)習(xí)。2016-08-08