Tôi đang làm việc trên một ứng dụng sử dụng kéo & thả trên Hình ảnh Tôi có thể thêm bất kỳ số lượng hình ảnh nào trong bố cục tương đối. Tôi có thể kéo hình ảnh, nhưng chỉ có một hình ảnh tại một thời điểm. Khi tôi thêm hình ảnh mới, tất cả các hình ảnh trước đó không thể chạm được.Kéo trên nhiều hình ảnh không hoạt động
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);
}
đây là mã tôi thêm hình ảnh mới. Ivtest là một hình ảnh toàn cầu.
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;
}
}
}
không đủ mã..thêm danh sách liên lạc và ảnh chụp nhanh giao diện người dùng .. – Ronnie
@ userSeven7s tôi đã chỉnh sửa mã. Một chút thay đổi của nó khi tôi đang thử một số thứ khác. nhưng nó bao gồm hầu hết mọi thứ. – Kamal
@Kamal Vui lòng xem câu trả lời của tôi. –