Android實(shí)現(xiàn)跟隨手指拖動(dòng)并自動(dòng)貼邊的View樣式(實(shí)例demo)
效果圖

代碼
/**
* 根據(jù)手指拖動(dòng)的當(dāng)前位置,自動(dòng)貼邊的View
*/
public class DragView extends ImageView implements View.OnTouchListener{
private int screenWidth;
private int screenHeight;
private Context mContext;
private int lastX, lastY;
private int left ,top;
private ViewGroup.MarginLayoutParams layoutParams;
private int startX;
private int endX;
private boolean isMoved = false;
private onDragViewClickListener mLister;
public interface onDragViewClickListener{
void onDragViewClick();
}
public void setOnDragViewClickListener(onDragViewClickListener listener){
this.mLister = listener;
}
public DragView(Context context) {
this(context,null);
}
public DragView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
screenWidth = displayMetrics.widthPixels;
screenHeight = displayMetrics.heightPixels-getStatusBarHeight();
init();
}
public void init(){
setOnTouchListener(this);
post(new Runnable() {
@Override
public void run() {
layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams();
layoutParams.topMargin = screenHeight - getHeight();
layoutParams.leftMargin = screenWidth - getWidth();
setLayoutParams(layoutParams);
}
});
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
startX = lastX;
break;
case MotionEvent.ACTION_MOVE:
isMoved = true;
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
left = v.getLeft() + dx;
top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
// 設(shè)置不能出界
if (left < 0) {
left = 0;
right = left + v.getWidth();
}
if (right > screenWidth) {
right = screenWidth;
left = right - v.getWidth();
}
if (top < 0) {
top = 0;
bottom = top + v.getHeight();
}
if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom );
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
//只有滑動(dòng)改變上邊距時(shí),抬起才進(jìn)行設(shè)置
if (isMoved) {
layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams();
layoutParams.topMargin = top;
setLayoutParams(layoutParams);
}
endX = (int) event.getRawX();
//滑動(dòng)距離比較小,當(dāng)作點(diǎn)擊事件處理
if (Math.abs(startX - endX) < 6) {
return false;
}
if (left +v.getWidth()/2 < screenWidth/2) {
startScroll(left,screenWidth/2,true);
} else {
startScroll(left,screenWidth/2,false);
}
break;
}
return true;
}
//在此處理點(diǎn)擊事件
@Override
public boolean onTouchEvent(MotionEvent event) {
mLister.onDragViewClick();
return super.onTouchEvent(event);
}
public void startScroll(final int start, int end, final boolean isLeft){
ValueAnimator valueAnimator = ValueAnimator.ofFloat(start,end).setDuration(800);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (isLeft) {
layoutParams.leftMargin = (int) (start*(1-animation.getAnimatedFraction()));
} else {
layoutParams.leftMargin = (int) (start + (screenWidth - start - getWidth())*(animation.getAnimatedFraction()));
}
setLayoutParams(layoutParams);
}
});
valueAnimator.start();
}
/**
* 獲取狀態(tài)欄的高度
* @return 狀態(tài)欄高度
*/
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}
以上所述是小編給大家介紹的Android實(shí)現(xiàn)跟隨手指拖動(dòng)并自動(dòng)貼邊的View樣式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android 根據(jù)EditText搜索框ListView動(dòng)態(tài)顯示數(shù)據(jù)
這篇文章主要介紹了Android 根據(jù)EditText搜索框ListView動(dòng)態(tài)顯示數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android實(shí)現(xiàn)手機(jī)定位的案例代碼
今天小編就為大家分享一篇關(guān)于Android實(shí)現(xiàn)手機(jī)定位的案例代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
activity 獲取rootView 設(shè)置backGroundColor的方法
下面小編就為大家?guī)硪黄猘ctivity 獲取rootView 設(shè)置backGroundColor的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
android MediaRecorder實(shí)現(xiàn)錄屏?xí)r帶錄音功能
這篇文章主要介紹了android MediaRecorder錄屏?xí)r帶錄音功能實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Android Activity的4種啟動(dòng)模式圖文介紹
這篇文章主要給大家介紹了關(guān)于Android Activity的4種啟動(dòng)模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Android 自定義輸入支付密碼的軟鍵盤實(shí)例代碼
這篇文章主要介紹了Android 自定義輸入支付密碼的軟鍵盤實(shí)例代碼的相關(guān)資料,并附簡單實(shí)例代碼和實(shí)現(xiàn)效果圖,需要的朋友可以參考下2016-11-11

