我正在尝试在Android中实现一个处理程序来缩放视图。我想用一个手指就能调整图片大小,而不是使用多点触控。
以下是我的活动代码。我感觉我已经非常接近了,但有五件事情无法正常工作。
我的Java活动:
以下是我的活动代码。我感觉我已经非常接近了,但有五件事情无法正常工作。
- 缩放比例不对。它增长的速度比应该快得多。已解决 感谢@Salauyou
- 视图只会增大,而不会缩小。 已解决 感谢@Salauyou
- 处理程序视图不随图像移动。 已解决 感谢@Salauyou
- 缩放开始非常小 已解决 感谢@Salauyou
- 处理程序不能完全跟随您的手指移动。
我的Java活动:
public class MainActivity extends Activity {
ImageView imageView;
ImageView dragHandle;
RelativeLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView1);
imageView.setBackgroundColor(Color.MAGENTA);
dragHandle = (ImageView) findViewById(R.id.imageView2);
dragHandle.setBackgroundColor(Color.CYAN);
layout = (RelativeLayout) findViewById(R.id.relativeLayout2);
layout.setBackgroundColor(Color.YELLOW);
setUpResize();
}
public void setUpResize() {
dragHandle.setOnTouchListener(new View.OnTouchListener() {
int[] touchPoint = new int[2];
int[] centerOfImage = new int[2];
double originalDistance = 0;
double modifiedDistance = 0;
float originalScale = 0;
float modifiedScale = 0;
public boolean onTouch(View v, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
centerOfImage[0] = (int) (imageView.getX() + imageView.getWidth() / 2);
centerOfImage[1] = (int) (imageView.getY() + imageView.getHeight() / 2);
touchPoint[0] = (int) motionEvent.getRawX();
touchPoint[1] = (int) motionEvent.getRawY();
int[] p = new int[2];
p[0] = touchPoint[0] - centerOfImage[0];
p[1] = touchPoint[1] - centerOfImage[1];
originalDistance = (float) Math.sqrt(p[0] * p[0] + p[1] * p[1]);
originalScale = imageView.getScaleX();
} else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
touchPoint[0] = (int) motionEvent.getRawX();
touchPoint[1] = (int) motionEvent.getRawY();
int[] p = new int[2];
p[0] = (touchPoint[0] + p[0] - centerOfImage[0]);
p[1] = (touchPoint[1] + p[1] - centerOfImage[1]);
modifiedDistance = Math.hypot(touchPoint[0] - centerOfImage[0], touchPoint[1] - centerOfImage[1]);
Log.e("resize", "original " + imageView.getWidth() + " modified: " + imageView.getHeight());
modifiedScale = (float) (modifiedDistance / originalDistance * originalScale);
imageView.setScaleX(modifiedScale);
imageView.setScaleY(modifiedScale);
dragHandle.setX(centerOfImage[0] + imageView.getWidth()/2 * modifiedScale);
dragHandle.setY(centerOfImage[1] + imageView.getHeight()/2 * modifiedScale);
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
}
return true;
}
});
}
}
我的xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/relativeLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_below="@+id/imageView1"
android:layout_toRightOf="@+id/imageView1"
android:src="@drawable/dragArrow" />
</RelativeLayout>
</RelativeLayout>
setScaleX()
和其他变换方法仅影响视图的绘制,而不是其在布局中的位置。 - Alex Salauyou