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仿iOS側(cè)滑退出當(dāng)前界面功能
這篇文章主要為大家詳細(xì)介紹了Android仿iOS側(cè)滑退出當(dāng)前界面功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12android自定義view實(shí)現(xiàn)鐘表效果
這篇文章主要為大家詳細(xì)介紹了android自定義view實(shí)現(xiàn)鐘表效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Android UI控件RatingBar實(shí)現(xiàn)自定義星星評(píng)分效果
這篇文章主要為大家詳細(xì)介紹了Android UI控件RatingBar實(shí)現(xiàn)自定義星星評(píng)分效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02安卓APP測(cè)試之使用Burp Suite實(shí)現(xiàn)HTTPS抓包方法
這篇文章主要介紹了安卓APP測(cè)試之使用Burp Suite實(shí)現(xiàn)HTTPS抓包方法,本文詳解講解了測(cè)試環(huán)境和各個(gè)軟件的配置方法,需要的朋友可以參考下2015-04-04簡(jiǎn)析Android五大布局(LinearLayout、FrameLayout、RelativeLayout等)
這篇文章主要為大家簡(jiǎn)單分析了Android五大布局,內(nèi)容有LinearLayout、FrameLayout、RelativeLayout、AbsoluteLayout和TableLayout的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06Android自定義View實(shí)現(xiàn)簡(jiǎn)單文字描邊功能
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)簡(jiǎn)單文字描邊功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Flutter仿微信通訊錄實(shí)現(xiàn)自定義導(dǎo)航條的示例代碼
某些頁(yè)面比如我們?cè)谶x擇聯(lián)系人或者某個(gè)城市的時(shí)候需要快速定位到我們需要的選項(xiàng),一般都會(huì)需要像微信通訊錄右邊有一個(gè)導(dǎo)航條一樣的功能,本文將利用Flutter實(shí)現(xiàn)這一效果,需要的可以參考一下2022-04-04android AlertDialog的簡(jiǎn)單使用實(shí)例
本篇文章主要介紹了android AlertDialog的簡(jiǎn)單使用實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01Android音視頻開發(fā)只硬件解碼組件MediaCodec講解
在Android開發(fā)中提供了實(shí)現(xiàn)音視頻編解碼工具M(jìn)ediaCodec,針對(duì)對(duì)應(yīng)音視頻解碼類型通過(guò)該類創(chuàng)建對(duì)應(yīng)解碼器就能實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行解碼操作。本文通過(guò)示例詳細(xì)講解了MediaCodec的使用,需要的可以參考一下2023-01-01Android仿人人客戶端滑動(dòng)菜單的側(cè)滑菜單效果
這篇文章主要介紹了Android仿人人客戶端滑動(dòng)菜單的側(cè)滑特效實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,分享給大家供大家參考2018-05-05