我正在制作应用程序,我想在屏幕上拖动图像。现在一切正常,但如果用户继续从左向右滑动,图像会更进一步向右移动。我不想这样做。
我想要的是图像不应该超出其边界宽度的一半。我的意思是图像视图应该只在视图/边界的一半。我希望它在我的意思是左,右,上,下的每个坐标中都偏离一半。它不应该消失。为此,我使用触摸监听器。现在我能够进行旋转,缩放和拖动(虽然它超出界限)
所以现在我想它不应该超出界限,这是我正在使用的代码:
@Override
public boolean onTouch(View v, MotionEvent event) {
// ImageView view = (ImageView) v;
//view.setScaleType(ImageView.ScaleType.MATRIX);
float scale;
// Dump touch event to log
dumpEvent(event);
// Handle touch events here...
ImageView imageView = (ImageView) v;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
mode = DRAG;
lastEvent = null;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDistance = spacing(event);
if (oldDistance > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
lastEvent = new float[4];
lastEvent[0] = event.getX(0);
lastEvent[1] = event.getX(1);
lastEvent[2] = event.getY(0);
lastEvent[3] = event.getY(1);
d = rotation(event);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
lastEvent = null;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
float newX = event.getX() - start.x;
float newY = event.getY() - start.y;
if ( newX <= 0-(imageView.getDrawable()
.getIntrinsicWidth() )){
Log.v("Bounds", "0-drawable width");
break;
}else if (newX >= screenWidth-(imageView.getDrawable()
.getIntrinsicWidth())){
Log.v("Bounds", "screen wdith-drawable width");
break;
}else if(newY <= 0-(imageView.getDrawable()
.getIntrinsicHeight())){
Log.v("Bounds", "Y 0-drawable width");
break;
}else if(newY >= (screenHeight-imageView.getDrawable()
.getIntrinsicHeight()) ) {
Log.v("Bounds", "y Screen-drawable width");
break;
}
matrix.set(savedMatrix);
matrix.postTranslate(newX, newY);
} else if (mode == ZOOM && event.getPointerCount() == 2) {
float newDistance = spacing(event);
if (newDistance > 10f) {
matrix.set(savedMatrix);
scale = newDistance / oldDistance;
float[] values = new float[9];
matrix.getValues(values);
float currentScale = values[Matrix.MSCALE_X];
if (scale * currentScale > MAX_ZOOM)
scale = MAX_ZOOM / currentScale;
else if (scale * currentScale < MIN_ZOOM)
scale = MIN_ZOOM / currentScale;
matrix.postScale(scale, scale, mid.x, mid.y);
}
if (lastEvent != null) {
newRot = rotation(event);
float r = newRot - d;
/* changes must be
float[] values = new float[9];
matrix.getValues(values);
float tx = values[2];
float ty = values[5];
float sx = values[0];
float xc = (view.getWidth() / 2) * sx;
float yc = (view.getHeight() / 2) * sx;
matrix.postRotate(r, tx + xc, ty + yc);
*/
float[] values = new float[9];
matrix.getValues(values);
float tx = values[2];
float ty = values[5];
float sx = values[0];
float xc = (imageView.getWidth() / 2) * sx;
float yc = (imageView.getHeight() / 2) * sx;
matrix.postRotate(r, tx + xc, ty + yc);
//I commented
matrix.postRotate(r, imageView.getMeasuredWidth() / 2,
imageView.getMeasuredHeight() / 2);
}
}
break;
}
imageView.setImageMatrix(matrix);
return true;
}
Eidt
这是我的XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/rl_capture">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/fl_camera">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="content_desc_overlay"
android:src="@drawable/ic_launcher"
android:id="@+id/img_view"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/iv_overlay"
android:src="@drawable/groom01"
android:scaleType="matrix"
/>
</FrameLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/btn_screenshot"
android:layout_gravity="right|top"
/>
</RelativeLayout>
答案 0 :(得分:0)
嗯。这有点令人困惑。您使用intrinsicWidth
/ intrinsicHeight
是否有某些特殊原因?这些通常不会产生我认为你认为他们屈服的东西(see here)。我假设您的imageView
设置为LayoutParams
,而您的重力未设置,因此图像的原点位于左上角。这就是我要做的事情(没有经过测试 - 告诉我是否有问题):
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
float newX = event.getX() - start.x;
float newY = event.getY() - start.y;
if ( newX < -imageView.getWidth()/2)){
Log.v("Bounds", "0-drawable width");
newX = -imageView.getWidth()/2;
}else if (newX > screenWidth-(imageView.getWidth()/2)){
Log.v("Bounds", "screen wdith-drawable width");
newX = screenWidth-(imageView.getWidth()/2);
}
// not else-if: consider the corners!
if(newY < -imageView.getHeight()/2){
Log.v("Bounds", "Y 0-drawable width");
newY = -imageView.getHeight()/2;
}else if(newY > (screenHeight-imageView.getHeight()/2) ) {
Log.v("Bounds", "y Screen-drawable width");
newY = screenHeight-imageView.getHeight()/2;
}
等等。