<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
對View的移動,實現的方法有好幾種,原理是通過改變View的位置來移動View,下面來實現這樣的效果
通過改變View的tranlationX和tranlationY的值來實現移動,首先來寫一個自定義View類,重寫onTouchEvent方法,實現構造方法
public class MyView extends View { public MyView(Context context) { super(context); } public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public boolean onTouchEvent(MotionEvent event) { return true;//這裡我們要消費這個事件,所以返回了true } }
關於移動的處理邏輯都在onTouchEvent方法中,下面的程式碼主要針對onTouchEvent方法修改,其它程式碼不再貼上了
首先要獲取手指點選移動在螢幕上的座標,使用
int x = (int)event.getRawX();//獲取x軸上的位置 int y = (int)event.getRawY();//獲取y軸上的位置
處理事件的模板程式碼
switch(event.getAction()){ case MotionEvent.ACTION_DOWN://點選事件 break; case MotionEvent.ACTION_MOVE://移動事件 break; case MotionEvent.ACTION_UP://離開事件 break; default: break; }
通過判斷事件的型別,將在ACTION_MOVE事件中計算移動前後的差值來設定View的translationX和translationY值來改變View的位置,這裡需要記錄上次的位置,所以需要2個變數,程式碼如下
private int mLaxtX; private int mLaxtY; @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getRawX(); int y = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int deltaX = x - mLastX;//計算x座標上的差值 int deltaY = y - mLastY;//計算y座標上的差值 float tranX = getTranslationX() + deltaX ;//要平移的x值 float tranY = getTranslationY() + deltaY;//要平移的y值 setTranslationX(tranX);//設定值 setTranslationY(tranY); break; case MotionEvent.ACTION_UP: break; default: break; } mLastX = x;//記錄上次的座標 mLastY = y; return true; }
View在繪製的時候,會呼叫onLayout方法來設定顯示的位置,可以通過這個方法來實現移動
//layout方法實現 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: //計算偏移量 int offsetX = x - mLastX; int offsetY = y - mLastY; //重新佈局 layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY); //也可以使用下面這種方法 // offsetLeftAndRight(offsetX); // offsetTopAndBottom(offsetY); break; case MotionEvent.ACTION_UP: break; default: break; } mLastX = x; mLastY = y;
LayoutParams儲存了一個View的佈局引數,通過改變這個引數,重繪View也可以實現移動
//LayoutParams方法 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int offsetX = x - mLastX; int offsetY = y - mLastY; //範例程式碼的父View是LinearLayout LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams(); layoutParams.leftMargin = getLeft() + offsetX; layoutParams.topMargin = getTop() + offsetY; //下面這兩句都可以使用,setLayoutParams也會呼叫requestLayout // setLayoutParams(layoutParams); requestLayout(); break; case MotionEvent.ACTION_UP: break; default: break; }
這裡先介紹這幾種方法
完整程式碼如下:
public class MyView extends View { public MyView(Context context) { super(context); } public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } private int mLastX; private int mLastY; @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getRawX(); int y = (int) event.getRawY(); //動畫實現移動程式碼 //-------------------------------------------------- // switch (event.getAction()) { // case MotionEvent.ACTION_DOWN: // // break; // case MotionEvent.ACTION_MOVE: // int delaltax = x - mLastX; // int delaltaY = y - mLastY; // float tranX = getTranslationX() + delaltax; // float tranY = getTranslationY() + delaltaY; // setTranslationX(tranX); // setTranslationY(tranY); // break; // case MotionEvent.ACTION_UP: // // break; // default: // break; // } //----------------------------------------------- //layout方法實現 // switch (event.getAction()) { // case MotionEvent.ACTION_DOWN: // break; // case MotionEvent.ACTION_MOVE: // //計算偏移量 // int offsetX = x - mLastX; // int offsetY = y - mLastY; // //重新佈局 // layout(getLeft() + offsetX, getTop() + offsetY, // getRight() + offsetX, getBottom() + offsetY); // //也可以使用下面這種方法 offsetLeftAndRight(offsetX); offsetTopAndBottom(offsetY); // break; // case MotionEvent.ACTION_UP: // break; // default: // break; // } //--------------------------------------------- //LayoutParams方法 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: int offsetX = x - mLastX; int offsetY = y - mLastY; //範例程式碼的父View是LinearLayout LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams(); layoutParams.leftMargin = getLeft() + offsetX; layoutParams.topMargin = getTop() + offsetY; //下面這兩句都可以使用,setLayoutParams也會呼叫requestLayout // setLayoutParams(layoutParams); requestLayout(); break; case MotionEvent.ACTION_UP: break; default: break; } mLastX = x; mLastY = y; return true; } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45