我想在我的活动中动态添加多个imageView,然后分别处理每个imageView上的触摸事件。我可以使用单个imageView执行此操作:
这是活动:
public class Touch extends Activity implements OnTouchListener {
private static final String TAG = "Touch";
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
private PointF start = new PointF();
private PointF mid = new PointF();
private float oldDist = 1f;
// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView view = (ImageView) findViewById(R.id.imageView);
view.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event)
{
ImageView view = (ImageView) v;
// Dump touch event to log
dumpEvent(event);
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG" );
mode = DRAG;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE" );
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,
event.getY() - start.y);
}
else if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM" );
}
break;
}
view.setImageMatrix(matrix);
return true; // indicate event was handled
}
/** Show an event in the LogCat view, for debugging */
private void dumpEvent(MotionEvent event) {
String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
"POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
StringBuilder sb = new StringBuilder();
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
sb.append("event ACTION_").append(names[actionCode]);
if (actionCode == MotionEvent.ACTION_POINTER_DOWN
|| actionCode == MotionEvent.ACTION_POINTER_UP) {
sb.append("(pid ").append(
action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append(")");
}
sb.append("[");
for (int i = 0; i < event.getPointerCount(); i++) {
sb.append("#").append(i);
sb.append("(pid ").append(event.getPointerId(i));
sb.append(")=").append((int) event.getX(i));
sb.append(",").append((int) event.getY(i));
if (i + 1 < event.getPointerCount())
sb.append(";");
}
sb.append("]");
Log.d(TAG, sb.toString());
}
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);
}
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);
}
}
这是main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout`xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageView android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/basketball"
android:scaleType="matrix"/>
</LinearLayout>
但是如果我在它下面添加另一个图像并将其宽度和高度设置为“wrap_content”,那么它只会在指定区域中移动。下面是我尝试添加多个触摸事件时得到的结果图像链接:
https://www.dropbox.com/s/vymbsv88fqm26xx/SC20121118-231359.png
答案 0 :(得分:0)
希望下面的代码可以帮助您解决问题。在这段代码中,我使用for循环创建了一个ImageViews数组。根据所触摸的图像,我在TextView中添加一个与单击的图像相对应的数字。
mImages= new ImageView[numImage];
for (int i=0; i <numImage; i++) {
String imgID = "imageNum" + (i+1);
int resID = getResources().getIdentifier(imgID, "id", getActivity().getPackageName());
mImages[i] = view.findViewById(resID);
mImages[i].setOnTouchListener(new ImageView.OnTouchListener() {
public boolean onTouch(View v, MotionEvent motionEvent) {
int msg=-1;
//v.getId() will give you the image id
switch(v.getId()){
case R.id.imageNum1:
if(v.getPivotX()==motionEvent.getX() && v.getPivotY()==motionEvent.getY()) {
msg = 1;
}
break;
case R.id.imageNum2:
msg=2;
break;
case R.id.imageNum3:
msg=3;
break;
case R.id.imageNum4:
msg=4;
break;
case R.id.imageNum5:
msg=5;
break;
case R.id.imageNum6:
msg=6;
break;
case R.id.imageNum7:
msg=7;
break;
case R.id.imageNum8:
msg=8;
break;
case R.id.imageNum9:
msg=9;
break;
}//switch
if(msg!=-1)
usertextView.setText(usertextView.getText().toString()+msg);
return true;
}//onTouch
});//setOnTouchlistener
}//for