【问题标题】:Using pinch zoom, drag and drop on same view使用捏缩放,在同一视图上拖放
【发布时间】:2014-05-13 18:50:15
【问题描述】:

我想在我的应用程序的同一视图上同时使用捏缩放和拖放。

我可以单独实现它们,但是当我尝试同时使用它们时它不起作用。

这里是拖拽代码

class MyClickListener implements OnLongClickListener {

    @Override
    public boolean onLongClick(View view) {

        ClipData.Item item = new ClipData.Item((CharSequence) view.getTag());

        String[] mimeTypes = { ClipDescription.MIMETYPE_TEXT_PLAIN };
        ClipData data = new ClipData(view.getTag().toString(), mimeTypes,
                item);
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);

        view.startDrag(data, // data to be dragged
                shadowBuilder, // drag shadow
                view, // local data about the drag and drop operation
                0 // no needed flags
        );
        return true;
    }
}

当我在非自定义视图上使用时效果很好,无需捏合即可缩放。

当我使用具有 scalegesture 侦听器的自定义视图,然后将 MyClickListener 设置为其 LongClickListener 时,我只获得缩放功能并且没有开始拖动。

检测到长按视图后,我尝试将拖拽代码直接添加到自定义视图中

public class TouchImageView extends View {
long time = 0;
private Drawable image;
private float scaleFactor = 1.0f;
private ScaleGestureDetector scaleGestureDetector;

public TouchImageView(Context context) {
    super(context);
}

public TouchImageView(Context context, Drawable mImage) {
    super(context);

    image = mImage;
    setFocusable(true);
    image.setBounds(0, 0, image.getIntrinsicWidth(),
            image.getIntrinsicHeight());
    scaleGestureDetector = new ScaleGestureDetector(context,
            new ScaleListener());
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // Set the image bounderies
    canvas.save();
    canvas.scale(scaleFactor, scaleFactor);
    image.draw(canvas);
    canvas.restore();
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getPointerCount() > 1) {
        scaleGestureDetector.onTouchEvent(event);
        invalidate();
    } else {
        int action = MotionEventCompat.getActionMasked(event);

        switch(action){
        case MotionEvent.ACTION_DOWN:
            time = SystemClock.elapsedRealtime();
            Log.i(EJ.TAG, time+"");
            break;

        case MotionEvent.ACTION_UP:
            long time1 = SystemClock.elapsedRealtime() - time;

            if(time1 >= 1000){

                ClipData.Item item = new ClipData.Item((CharSequence) this.getTag());

                String[] mimeTypes = { ClipDescription.MIMETYPE_TEXT_PLAIN };
                ClipData data = new ClipData(this.getTag().toString(), mimeTypes,
                        item);
                DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(this);

                this.startDrag(data, // data to be dragged
                        shadowBuilder, // drag shadow
                        this, // local data about the drag and drop operation
                        0 // no needed flags
                );

                //Toast.makeText(context, "Long press", Toast.LENGTH_SHORT).show();

                return true;
            }

            break;              
        }

    }

    return true;
}

private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        scaleFactor *= detector.getScaleFactor();

        // don't let the object get too small or too large.
        scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 5.0f));

        invalidate();
        return true;
    }
}

 }

我不确定这是否是正确的方法。对此的任何帮助表示赞赏

【问题讨论】:

    标签: android android-view android-gesture


    【解决方案1】:

    查看下面给出的演示,了解捏合缩放、翻译和缩放功能。希望对您有所帮助。

    Example 1

    Example 2

    您可以询问您是否还有其他疑问:)。

    编码愉快!

    【讨论】:

    • 示例 1 无法解决我的问题,它需要图像填充父级的高度和宽度。我将有几张图片,我需要对每一张进行缩放和移动。
    • 在示例 2 中,我想给出固定尺寸,我的意思是它不能从给定尺寸放大。那么我该如何实现它,请告诉我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2020-02-18
    相关资源
    最近更新 更多