<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/iv_1"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/demo1"/>
<Switch
android:id="@+id/switchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/iv_1"
android:layout_marginTop="40dp"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
public class MainActivity extends AppCompatActivity {
private ImageView iv_1;
private int screenHeightHalf;
private int originalLeft, originalTop, originalRight, originalBottom;
private Switch switchButton;
private ScaleGestureDetector scaleGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
screenHeightHalf = getScreenHeightHalf(MainActivity.this);
switchButton = findViewById(R.id.switchButton);
iv_1 = (ImageView) findViewById(R.id.iv_1);
scaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener());
iv_1.setOnTouchListener(touchListener);
switchButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
iv_1.setOnTouchListener(touchListener2);
}else {
iv_1.setOnTouchListener(touchListener);
}
}
});
}
private View.OnTouchListener touchListener2=new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
scaleGestureDetector.onTouchEvent(event);
return true;
}
};
private View.OnTouchListener touchListener = new View.OnTouchListener() {
private int lastX, lastY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
originalLeft = v.getLeft();
originalTop = v.getTop();
originalRight = v.getRight();
originalBottom = v.getBottom();
break;
case MotionEvent.ACTION_MOVE:
//测试控件移动的位置
int top = v.getTop();
int screenHeight = screenHeightHalf * 2;
Log.d("TAG", "ImageView Top: " + top + ", Screen Height: " + screenHeight);
moveView(v, event.getRawX() - lastX, event.getRawY() - lastY);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
switch (v.getId()){
case R.id.iv_1:
Toast.makeText(MainActivity.this, "1", Toast.LENGTH_SHORT).show();
break;
}
// 处理抬起事件
/*if (v.getTop()<500) {
// 返回原始位置
//TODO
Toast.makeText(MainActivity.this, "超过1/2屏幕高度", Toast.LENGTH_SHORT).show();
}else {
v.layout(originalLeft, originalTop, originalRight, originalBottom);
}*/
break;
}
return true;
}
};
private void moveView(View view, float dx, float dy) {
int left = view.getLeft() + (int) dx;
int top = view.getTop() + (int) dy;
int right = view.getRight() + (int) dx;
int bottom = view.getBottom() + (int) dy;
view.layout(left, top, right, bottom);
}
public int getScreenHeightHalf(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return displayMetrics.heightPixels / 2;
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
private float scaleFactor = 1.0f;
@Override
public boolean onScale(ScaleGestureDetector detector) {
scaleFactor *= detector.getScaleFactor();
scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 5.0f));
iv_1.setScaleX(scaleFactor);
iv_1.setScaleY(scaleFactor);
return true;
}
}
}
参考了之前的一篇手势滑动的博客