Android實(shí)現(xiàn)View的拖拽
本文實(shí)例為大家分享了Android實(shí)現(xiàn)View拖拽的具體代碼,供大家參考,具體內(nèi)容如下
前言
實(shí)現(xiàn)View的拖拽,其實(shí)原理很簡(jiǎn)單。無(wú)非就是獲取手指的位移信息,然后view根據(jù)手指的位移信息,移動(dòng)對(duì)應(yīng)的位置。
首先是獲取手機(jī)的位移信息就可以根據(jù)需求不同分為兩種
- 拖拽view本身,view實(shí)現(xiàn)移動(dòng)。則設(shè)置view的setOnTouchListener。
- 在activity中隨意滑動(dòng),view都會(huì)反應(yīng)出動(dòng)作。則重寫activity onTouchEvent方法。
而移動(dòng)的方法嘛,也有幾種
- 給view設(shè)置補(bǔ)間動(dòng)畫,動(dòng)畫時(shí)間為0.(不推薦,因?yàn)橐苿?dòng)的只是view的影子,本地還在原地)
- 更改view 的margin。(不推薦,會(huì)影響viewgroup的布局排布)
- 根據(jù)屬性動(dòng)畫原理,更改setTranslationX和setTranslationY.(推薦此方法,不會(huì)影響原理的布局排布)
代碼
public class ViewTestActivity extends AppCompatActivity {
private static final String TAG = "ViewTestActivity";
private TextView mTv1,mTv2;
private double lastx,lastY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_test);
mTv1= (TextView) findViewById(R.id.tv01);
mTv1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
double x=event.getRawX();
double y=event.getRawY();
Log.d(TAG, "onTouch: "+event.getAction());
if (event.getAction()==MotionEvent.ACTION_DOWN){
lastx=x;
lastY=y;
}else if (event.getAction()==MotionEvent.ACTION_MOVE){
double dx=x-lastx;
double dy=y-lastY;
Log.d(TAG, "onTouch: dx=="+dx+",dy=="+dy);
// startAnimation(dx,dy);
// moveMethod1(dx, dy);
moveMethod2(dx, dy);
lastx=x;
lastY=y;
}
return true;
}
});
}
// @Override
// public boolean onTouchEvent(MotionEvent event) {
// double x=event.getRawX();
// double y=event.getRawY();
// Log.d(TAG, "onTouch: "+event.getAction());
// if (event.getAction()==MotionEvent.ACTION_DOWN){
// lastx=x;
// lastY=y;
// }else if (event.getAction()==MotionEvent.ACTION_MOVE){
// double dx=x-lastx;
// double dy=y-lastY;
// Log.d(TAG, "onTouch: dx=="+dx+",dy=="+dy);
//// startAnimation(dx,dy);
//
// // moveMethod1(dx, dy);
// moveMethod2(dx, dy);
//
// lastx=x;
// lastY=y;
// }
// return true;
// }
//根據(jù)屬性動(dòng)畫的原理
private void moveMethod2(double dx, double dy) {
mTv1.setTranslationX((float) (mTv1.getTranslationX()+dx));
mTv1.setTranslationY((float) (mTv1.getTranslationY()+dy));
}
//根據(jù)margin 原理
private void moveMethod1(double dx, double dy) {
ViewGroup.MarginLayoutParams marginLayoutParams= (ViewGroup.MarginLayoutParams) mTv1.getLayoutParams();
marginLayoutParams.leftMargin+=dx;
marginLayoutParams.topMargin+=dy;
mTv1.setLayoutParams(marginLayoutParams);
}
private void startAnimation(double dx, double dy) {
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(mTv1,"translationX", (float) (mTv1.getTranslationX()+dx)).setDuration(3000);
objectAnimator.start();
ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(mTv1,"translationY", (float) (mTv1.getTranslationY()+dy)).setDuration(3000);
objectAnimator2.start();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義View實(shí)現(xiàn)可拖拽縮放的矩形框
- Android自定義View實(shí)現(xiàn)拖拽效果
- Android使用RecycleView實(shí)現(xiàn)拖拽交換item位置
- Android自定義view實(shí)現(xiàn)拖拽選擇按鈕
- Android recyclerview實(shí)現(xiàn)拖拽排序和側(cè)滑刪除
- Android新特性頁(yè)面之ViewPager拖拽到最后一頁(yè)再拖拽打開其他Activity(三種方法)
- Android HorizontalScrollView內(nèi)子控件橫向拖拽實(shí)例代碼
- Android自定義View實(shí)現(xiàn)可以拖拽的GridView
- Android中在GridView網(wǎng)格視圖上實(shí)現(xiàn)item拖拽交換的方法
- android ListView和GridView拖拽移位實(shí)現(xiàn)代碼
相關(guān)文章
android使用PopupWindow實(shí)現(xiàn)頁(yè)面點(diǎn)擊頂部彈出下拉菜單
這篇文章主要給大家介紹android使用PopupWindow實(shí)現(xiàn)頁(yè)面點(diǎn)擊頂部彈出下拉菜單,實(shí)現(xiàn)此功能主要通過PopupWindow方法,代碼也很簡(jiǎn)單,需要的朋友可以參考下2015-08-08
Android開發(fā)之動(dòng)畫實(shí)現(xiàn)方法
這篇文章主要介紹了Android開發(fā)之動(dòng)畫實(shí)現(xiàn)方法,實(shí)例分析了Android中動(dòng)畫的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-05-05
android常見手動(dòng)和自動(dòng)輪播圖效果
這篇文章主要為大家詳細(xì)介紹了android常見手動(dòng)和自動(dòng)輪播圖效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Android實(shí)現(xiàn)強(qiáng)制下線功能的示例代碼
這篇文章主要介紹了Android實(shí)現(xiàn)強(qiáng)制下線功能的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Android Studio 報(bào)錯(cuò)“app:processDebugResources"解決方法
這篇文章主要介紹了Android Studio 報(bào)錯(cuò)“app:processDebugResources"解決方法的相關(guān)資料,需要的朋友可以參考下2017-07-07
Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求
這篇文章主要為大家詳細(xì)介紹了Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
android實(shí)現(xiàn)定時(shí)拍照并發(fā)送微博功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)定時(shí)拍照并發(fā)送微博功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

