Android實現(xiàn)View的拖拽
本文實例為大家分享了Android實現(xiàn)View拖拽的具體代碼,供大家參考,具體內(nèi)容如下
前言
實現(xiàn)View的拖拽,其實原理很簡單。無非就是獲取手指的位移信息,然后view根據(jù)手指的位移信息,移動對應的位置。
首先是獲取手機的位移信息就可以根據(jù)需求不同分為兩種
- 拖拽view本身,view實現(xiàn)移動。則設置view的setOnTouchListener。
- 在activity中隨意滑動,view都會反應出動作。則重寫activity onTouchEvent方法。
而移動的方法嘛,也有幾種
- 給view設置補間動畫,動畫時間為0.(不推薦,因為移動的只是view的影子,本地還在原地)
- 更改view 的margin。(不推薦,會影響viewgroup的布局排布)
- 根據(jù)屬性動畫原理,更改setTranslationX和setTranslationY.(推薦此方法,不會影響原理的布局排布)
代碼
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ù)屬性動畫的原理 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(); } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android自定義View實現(xiàn)可拖拽縮放的矩形框
- Android自定義View實現(xiàn)拖拽效果
- Android使用RecycleView實現(xiàn)拖拽交換item位置
- Android自定義view實現(xiàn)拖拽選擇按鈕
- Android recyclerview實現(xiàn)拖拽排序和側(cè)滑刪除
- Android新特性頁面之ViewPager拖拽到最后一頁再拖拽打開其他Activity(三種方法)
- Android HorizontalScrollView內(nèi)子控件橫向拖拽實例代碼
- Android自定義View實現(xiàn)可以拖拽的GridView
- Android中在GridView網(wǎng)格視圖上實現(xiàn)item拖拽交換的方法
- android ListView和GridView拖拽移位實現(xiàn)代碼
相關(guān)文章
Android UI控件RatingBar實現(xiàn)自定義星星評分效果
這篇文章主要為大家詳細介紹了Android UI控件RatingBar實現(xiàn)自定義星星評分效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02安卓APP測試之使用Burp Suite實現(xiàn)HTTPS抓包方法
這篇文章主要介紹了安卓APP測試之使用Burp Suite實現(xiàn)HTTPS抓包方法,本文詳解講解了測試環(huán)境和各個軟件的配置方法,需要的朋友可以參考下2015-04-04簡析Android五大布局(LinearLayout、FrameLayout、RelativeLayout等)
這篇文章主要為大家簡單分析了Android五大布局,內(nèi)容有LinearLayout、FrameLayout、RelativeLayout、AbsoluteLayout和TableLayout的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06Android自定義View實現(xiàn)簡單文字描邊功能
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)簡單文字描邊功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12Flutter仿微信通訊錄實現(xiàn)自定義導航條的示例代碼
某些頁面比如我們在選擇聯(lián)系人或者某個城市的時候需要快速定位到我們需要的選項,一般都會需要像微信通訊錄右邊有一個導航條一樣的功能,本文將利用Flutter實現(xiàn)這一效果,需要的可以參考一下2022-04-04Android音視頻開發(fā)只硬件解碼組件MediaCodec講解
在Android開發(fā)中提供了實現(xiàn)音視頻編解碼工具MediaCodec,針對對應音視頻解碼類型通過該類創(chuàng)建對應解碼器就能實現(xiàn)對數(shù)據(jù)進行解碼操作。本文通過示例詳細講解了MediaCodec的使用,需要的可以參考一下2023-01-01