이미지 뷰 변형에 대한 자습서가 있습니다. 정말 필요합니다. here is the link. 그것은 잘 작동하지만 약간 수정해야합니다. 여기 내 문제는 두 번째 이미지 뷰를 추가 할 때 내가 추가 한 첫 번째 이미지 뷰를 수정할 수 없다는 것입니다. 그것은 두 번째 관점 뒤에 있기 때문에 나는 그것을 만질 수없는 것 같습니다. 나는이 문제에 대해서도 묻고있는 링크에서 주석을 읽었으며 settag 및 gettag를 수행하여 문제를 해결합니다. 어떻게해야할지 모르겠다. 어떤 제안이야? 감사. 안드로이드와 이미지에 xml 파일 세트 태그에서ImageView onTouchListener : 뒤에서 이미지 뷰를 터치 할 수 없습니다.
:
public class MainActivity extends Activity implements OnTouchListener {
// these matrices will be used to move and zoom image
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
// we can be in one of these 3 states
private static final int NONE = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
private int mode = NONE;
// remember some things for zooming
private PointF start = new PointF();
private PointF mid = new PointF();
private float oldDist = 1f;
private float d = 0f;
private float newRot = 0f;
private float[] lastEvent = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView view = (ImageView) findViewById(R.id.imageView);
ImageView view2 = (ImageView) findViewById(R.id.imageView2);
view.setOnTouchListener(this);
view2.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {
// handle touch events here
ImageView view = (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:
oldDist = spacing(event);
if (oldDist > 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) {
matrix.set(savedMatrix);
float dx = event.getX() - start.x;
float dy = event.getY() - start.y;
matrix.postTranslate(dx, dy);
} else if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = (newDist/oldDist);
matrix.postScale(scale, scale, mid.x, mid.y);
}
if (lastEvent != null && event.getPointerCount() == 2) {
newRot = rotation(event);
float r = newRot - d;
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);
}
}
break;
}
view.setImageMatrix(matrix);
return true;
}
/**
* Determine the space between the first two fingers
*/
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
/**
* Calculate the mid point of the first two fingers
*/
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x/2, y/2);
}
/**
* Calculate the degree to be rotated by.
*
* @param event
* @return Degrees
*/
private float rotation(MotionEvent event) {
double delta_x = (event.getX(0) - event.getX(1));
double delta_y = (event.getY(0) - event.getY(1));
double radians = Math.atan2(delta_y, delta_x);
return (float) Math.toDegrees(radians);
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="matrix"
android:src="@drawable/chill"
/>
<ImageView
android:id="@+id/imageView2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="matrix"
android:src="@drawable/awesome"
/>
</FrameLayout>
내 문제는 내가 두 번째 ImageView를 추가 할 때 추가 한 첫 번째 이미지 뷰를 만질 수 없다는 것입니다. 어떻게하면 첫 번째 이미지에 액세스 할 수 있습니까? – Erick
프레임 레이아웃을 사용하여 한 이미지를 다른 이미지 위에 두어 클릭 이벤트를 두 이미지에 모두주고 이미지에 액세스 할 수있었습니다. 문제가 발생한 곳을 알려주십시오. –
@ JIGAR PANDYA : 버튼을 클릭하여 프로그래밍 방식으로 이미지 뷰를 추가하고 있습니다. 이미지 뷰가 framelayout 내부에 추가됩니다. 첫 번째 이미지 뷰를 추가하면 변환은 잘되지만 두 번째 이미지 뷰를 추가하기 위해 버튼을 클릭하면 첫 번째 뷰가 두 번째 뷰 아래로 이동하여 손댈 수 없게됩니다. 내가 만질 수있는 유일한 것은 제가 추가 한 가장 최근의 견해입니다. 희망을 도울 수있다 :) – Erick