實(shí)現(xiàn)一個(gè)跟隨手指移動的view其實(shí)是特別容易實(shí)現(xiàn)的毁习,不過有的時(shí)候還是挺有用的牍鞠,最近做的視頻互動軟件就有這樣的需求歼指,大概幾十行代碼就可以搞定爹土,然后記錄一下吧。
實(shí)現(xiàn)的主要思想踩身,就是利用onTouchListener胀茵,然后判斷出手指按下的點(diǎn),同時(shí)監(jiān)聽移動的事件挟阻,然后稍微計(jì)算一下就可以求出來view最終應(yīng)該呈現(xiàn)的位置了琼娘,然后通過改變LayoutParams的值就可以是實(shí)現(xiàn)view的跟隨手指拖拽的效果了,當(dāng)然還可以優(yōu)化赁濒,例如通過計(jì)算如果移到屏幕邊緣就停下來之類的轨奄,或者哪里是不能移到地方。
public class TestActivity extends AppCompatActivity implements View.OnTouchListener {
private ImageView imageView;
private RelativeLayout relativeLayout;
private int lastX, lastY; //保存手指點(diǎn)下的點(diǎn)的坐標(biāo)
final static int IMAGE_SIZE = 150;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
imageView = (ImageView) findViewById(R.id.image);
relativeLayout = (RelativeLayout) findViewById(R.id.layout);
//初始設(shè)置一個(gè)layoutParams
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(IMAGE_SIZE,IMAGE_SIZE);
imageView.setLayoutParams(layoutParams);
//設(shè)置屏幕觸摸事件
imageView.setOnTouchListener(this);
}
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
//將點(diǎn)下的點(diǎn)的坐標(biāo)保存
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//計(jì)算出需要移動的距離
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
//將移動距離加上拒炎,現(xiàn)在本身距離邊框的位置
int left = view.getLeft() + dx;
int top = view.getTop() + dy;
//獲取到layoutParams然后改變屬性挪拟,在設(shè)置回去
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
layoutParams.height = IMAGE_SIZE;
layoutParams.width = IMAGE_SIZE;
layoutParams.leftMargin = left;
layoutParams.topMargin = top;
view.setLayoutParams(layoutParams);
//記錄最后一次移動的位置
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
}
//刷新界面
relativeLayout.invalidate();
return true;
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/image"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@mipmap/ic_launcher"
/>
</RelativeLayout>
以上便是這個(gè)簡單的view啦,思路還是很清晰的击你,當(dāng)然能夠改造的地方有很多玉组,例如加一個(gè)慣性的效果啊,或者弄一個(gè)加速度的效果啊丁侄,都是可以的