android捏缩放

时间:2011-03-21 09:33:48

标签: android pinchzoom image-zoom

我的布局包含按钮,文本视图等。是否可以在布局中实现缩放?

7 个答案:

答案 0 :(得分:44)

查看以下可能对您有帮助的链接

以下链接提供了最佳示例,您可以重构以满足您的要求。

  1. implementing-the-pinch-zoom-gestur

  2. Android-pinch

  3. GestureDetector.SimpleOnGestureListener

答案 1 :(得分:37)

对于android 2.2+(api level8),您可以使用ScaleGestureDetector。

你需要一名成员:

private ScaleGestureDetector mScaleDetector;

在您的构造函数(或onCreate())中添加:

mScaleDetector = new ScaleGestureDetector(context, new OnScaleGestureListener() {
    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {
    }
    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        return true;
    }
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        Log.d(LOG_KEY, "zoom ongoing, scale: " + detector.getScaleFactor());
        return false;
    }
});

您覆盖onTouchEvent:

@Override
public boolean onTouchEvent(MotionEvent event) {
    mScaleDetector.onTouchEvent(event);
    return true;
}

如果您手动绘制视图,则在onScale()中可能会将比例因子存储在成员中,然后调用invalidate()并在onDraw()中绘制时使用比例因子。 否则,您可以直接修改字体大小或onScale()中的字体大小。

答案 2 :(得分:15)

我使用this教程为TextView实现了缩放缩放。结果代码如下:

private GestureDetector gestureDetector;
private View.OnTouchListener gestureListener;

并在onCreate()中:

    // Zoom handlers
    gestureDetector = new GestureDetector(new MyGestureDetector());
    gestureListener = new View.OnTouchListener() {

        // We can be in one of these 2 states
        static final int NONE = 0;
        static final int ZOOM = 1;
        int mode = NONE;

        static final int MIN_FONT_SIZE = 10;
        static final int MAX_FONT_SIZE = 50;

        float oldDist = 1f;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            TextView textView = (TextView) findViewById(R.id.text);

            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_POINTER_DOWN:
                    oldDist = spacing(event);
                    Log.d(TAG, "oldDist=" + oldDist);
                    if (oldDist > 10f) {
                       mode = ZOOM;
                       Log.d(TAG, "mode=ZOOM" );
                    }
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (mode == ZOOM) {
                        float newDist = spacing(event);
                        // If you want to tweak font scaling, this is the place to go.
                        if (newDist > 10f) {
                            float scale = newDist / oldDist;

                            if (scale > 1) {
                                scale = 1.1f;
                            } else if (scale < 1) {
                                scale = 0.95f;
                            }

                            float currentSize = textView.getTextSize() * scale;
                            if ((currentSize < MAX_FONT_SIZE && currentSize > MIN_FONT_SIZE)
                                    ||(currentSize >= MAX_FONT_SIZE && scale < 1)
                                    || (currentSize <= MIN_FONT_SIZE && scale > 1)) {
                                textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, currentSize);
                            }
                        }
                    }
                    break;
                }
            return false;
        }

魔术常数1.1和0.95是根据经验选择的(使用scale变量为此目的使我的TextView表现得有些怪异。)

答案 3 :(得分:5)

还有这个项目可以完成这项工作并且对我来说非常有效: https://github.com/chrisbanes/PhotoView

答案 4 :(得分:4)

在蜂窝,API级别11,可以,我们可以使用setScalaX和setScaleY与枢轴点
我在这里解释了这一点 Zooming a view completely
Pinch Zoom to view completely

答案 5 :(得分:1)

我创建了一个支持Android 2.1 +

的基本缩放缩放项目

可用here

答案 6 :(得分:0)

我有一个开源库,可以很好地完成这项工作。这是一个四个手势库,带有开箱即用的平移缩放设置。你可以在这里找到它:https://bitbucket.org/warwick/hacergestov3 或者您可以在此处下载演示应用:https://play.google.com/store/apps/details?id=com.WarwickWestonWright.HacerGestoV3Demo 这是一个纯画布库,所以它可以在任何场景中使用。 希望这会有所帮助。