捏合缩放列表视图 Android

13

我正在尝试在Android中实现ListView的缩放,但是当我点击并拖动缩放的ListView时,遇到了问题。以下是代码:

public class ScaleListView extends ListView {

private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f;
private float x = 0;
private float y = 0;
private float startx = 0;
private float starty = 0;
private boolean canClick = true;
private float xtranslation = 0;

public ScaleListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        startx = ev.getX();
        starty = ev.getY();
    }

    if (ev.getPointerCount() > 1) {
        y = ev.getY();
        x = ev.getX();
    } else if (ev.getAction() == MotionEvent.ACTION_UP) {
        canClick = (ev.getX() - startx) == 0 && (ev.getY() - starty) == 0 && mScaleFactor == 1;
    } else if(ev.getAction() == MotionEvent.ACTION_MOVE){
        xtranslation = ev.getX() - startx;
    }       
    mScaleDetector.onTouchEvent(ev);
    return super.onTouchEvent(ev);
}   
@Override
public void onDraw(Canvas canvas) {
    canvas.scale(mScaleFactor, mScaleFactor, x , y);
    canvas.translate(xtranslation, 0);
    super.onDraw(canvas);
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        canClick = false;
        mScaleFactor *= detector.getScaleFactor();

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

        if (mScaleFactor <= 1) {
            mScaleFactor = 1;
            canClick = true;
        }

        xPos = ScaleListView.this.getWidth() - detector.getFocusX();

        ScaleListView.this.invalidate();
        return true;
    }
}   
public boolean canClick(){
    return canClick;
}

问题出在翻译上。它变成了无限的,我可以水平拖动它并将列表视图移出视口。所以我不知道如何给翻译加边缘...感谢任何帮助。

1
你找到解决方案了吗? - Qadir Hussain
能否在ScrollView中添加上述ListView?我认为这可能会引起问题。 - fatboy
我认为这个列表视图的捏合缩放链接对你会有用。 - Alka Jadav
一个缩放列表的语义是什么?! - Bondax
嗯...我的客户抱怨他们的用户有视力问题。现在安卓提供了原生的辅助功能,但我发布这篇文章时还没有(虽然我不太记得了)。而且我甚至不记得我是如何解决客户的问题的。我唯一记得的是我无法让它按照我想要的方式工作。 - Augusto
显示剩余2条评论
3个回答

2

抱歉,我不再有访问该代码的权限。 不幸的是,我甚至不记得我对这个功能请求做了什么。 :( 既然您的答案似乎是最佳解决方案,那我会接受您的答案。 - Augusto
没关系,我只是想在某个地方发布这个。我浪费了一整天的时间寻找一个不太破碎的来管理。 - Xjasz

1
以下代码将我的TextView限制在屏幕边缘。希望这能帮助您的ListView。我在ACTION:Move上编写了这段代码。
layoutParams.leftMargin = X - _xDelta;
                    layoutParams.topMargin = Y - _yDelta;
                    if (layoutParams.leftMargin < 0) {
                        layoutParams.leftMargin = 20;
                    } else if (layoutParams.leftMargin > mainimage.getWidth()) {
                        layoutParams.leftMargin = mainimage.getWidth() - 20;
                    }
                    if (layoutParams.topMargin < 0) {
                        layoutParams.topMargin = 20;
                    } else if (layoutParams.topMargin > mainimage.getHeight() - 100) {
                        text.setText(text2.getText().toString());
                        layoutParams.topMargin = mainimage.getHeight() - 90
                                - text.getHeight();
                        // layoutParams.leftMargin = 20;
                    }

                    text.setX(layoutParams.leftMargin);
                    text.setY(layoutParams.topMargin);

                    v.setLayoutParams(text.getLayoutParams());

0
请在这里找到zoomListView类。您可以设置pinchZoom以及doubletap来缩放/取消缩放。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接