【发布时间】:2012-06-23 07:59:43
【问题描述】:
我正在开发一个在图像上使用拖放的应用程序,我可以在相对布局中添加任意数量的图像。我可以拖动图像,但一次只能拖动一个。添加新图像后,所有以前的图像都不可触摸。
public void addImage(Bitmap bmp)
{
ivtest= new ImageView(TabletActivity.this);
if(bmp!=null)
{
ivtest.setImageBitmap(bmp);
rlAddView.addView(ivtest, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
bmp= null;
}
ivtest.setTag("sdjfjd");
ivtest.bringToFront();
ivtest.setScaleType(ScaleType.MATRIX);
ivtest.setOnTouchListener(this);
}
这是我添加新图像的代码。 ivtest 是一个全局 imageView。
public class TestImage extends View implements OnTouchListener
{
private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f;
private Drawable mIcon;
private float mLastTouchX;
private static final int INVALID_POINTER_ID = -1;
// The ‘active pointer’ is the one currently moving our object.
private int mActivePointerId = INVALID_POINTER_ID;
private float mPosX;
private float mPosY;
private float mLastTouchY;
public TestImage(Context context, Drawable _micon)
{
super(context);
mIcon =_micon;
WindowManager wManager= (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
mIcon.setBounds((int)getPivotX(), (int)getPivotY(), mIcon.getIntrinsicWidth(),mIcon.getIntrinsicWidth());
// setOnTouchListener(this);
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}
@Override
public boolean onTouch(View view, MotionEvent ev)
{
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
{
final float x = ev.getX();
final float y = ev.getY();
mLastTouchX = x;
mLastTouchY = y;
mActivePointerId = ev.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
final float x = ev.getX(pointerIndex);
final float y = ev.getY(pointerIndex);
// Only move if the ScaleGestureDetector isn't processing a gesture.
if (!mScaleDetector.isInProgress()) {
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
invalidate();
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = ev.getX(newPointerIndex);
mLastTouchY = ev.getY(newPointerIndex);
mActivePointerId = ev.getPointerId(newPointerIndex);
}
break;
}
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(),mIcon.getIntrinsicWidth());
mIcon.draw(canvas);
canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
invalidate();
return true;
}
}
}
【问题讨论】:
-
没有足够的代码..添加触摸监听器和 UI 快照..
-
@userSeven7s 我已经编辑了代码。当我尝试其他事情时,它会发生一些变化。但它涵盖了大部分内容。
-
使用下面的 SO 答案链接来解决这个问题,它可能会帮助你。 Drag & Drop Images
-
在您的回答中,他们已经有两个静态图像视图。在我的情况下,我在运行时添加它们并且它们都具有相同的标签。
-
@Kamal:我面临着类似的事情。我不知道如何使用
android-multitouch-controller。你能显示你的代码以供参考吗?提前致谢。
标签: android