布局缩放与小部件



我正在尝试用图像背景和小部件(如textview)缩放布局。我已经通过搜索和遵循一些教程实现了缩放。但问题是缩放布局时不流畅(闪烁)。

关于这个问题,有人有什么解决办法吗?或者有不同的方法如何平滑缩放布局?

如有任何意见,我将不胜感激。

下面是我的代码:

public class ZoomActivity extends Activity {
    View mainView = null;
    PointF start = new PointF();
    PointF mid = new PointF();
    float oldDist = 1f;
    PointF oldDistPoint = new PointF();
    public static String TAG = "ZOOM";
    static final int NONE = 0;
    static final int DRAG = 1;
    static final int ZOOM = 2;
    int mode = NONE;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.landingpage);
        mainView = (LinearLayout) findViewById(R.id.linear);
        mainView.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                Log.d(TAG, "mode=DRAG");
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    start.set(event.getX(), event.getY());
                    Log.d(TAG, "mode=DRAG");
                    mode = DRAG;
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    oldDist = spacing(event);
                    oldDistPoint = spacingPoint(event);
                    Log.d(TAG, "oldDist=" + oldDist);
                    if (oldDist > 10f) {
                        midPoint(mid, event);
                        mode = ZOOM;
                        Log.d(TAG, "mode=ZOOM");
                    }
                    System.out.println("current time :"
                            + System.currentTimeMillis());
                    break;// return !gestureDetector.onTouchEvent(event);
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_POINTER_UP:
                    Log.d(TAG, "mode=NONE");
                    mode = NONE;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (mode == DRAG) {
                    } else if (mode == ZOOM) {
                        PointF newDist = spacingPoint(event);
                        float newD = spacing(event);
                        Log.e(TAG, "newDist=" + newDist);
                        float[] old = new float[9];
                        float[] newm = new float[9];
                        Log.e(TAG, "x=" + old[0] + ":&:" + old[2]);
                        Log.e(TAG, "y=" + old[4] + ":&:" + old[5]);
                        float scale = newD / oldDist;
                        float scalex = newDist.x / oldDistPoint.x;
                        float scaley = newDist.y / oldDistPoint.y;
                        zoom(scale, scale, start);
                    }
                    break;
                }
                return true;
            }
        });
    }
    /**
     * zooming is done from here
     */
    public void zoom(Float scaleX, Float scaleY, PointF pivot) {
        mainView.setPivotX(pivot.x);
        mainView.setPivotY(pivot.y);
        mainView.setScaleX(scaleX);
        mainView.setScaleY(scaleY);
    }
    /**
     * space between the first two fingers
     */
    private float spacing(MotionEvent event) {
        // ...
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return FloatMath.sqrt(x * x + y * y);
    }
    private PointF spacingPoint(MotionEvent event) {
        PointF f = new PointF();
        f.x = event.getX(0) - event.getX(1);
        f.y = event.getY(0) - event.getY(1);
        return f;
    }
    /**
     * the mid point of the first two fingers
     */
    private void midPoint(PointF point, MotionEvent event) {
        // ...
        float x = event.getX(0) + event.getX(1);
        float y = event.getY(0) + event.getY(1);
        point.set(x / 2, y / 2);
    }
}

你可以试试这个zoomview -> https://code.google.com/p/android-zoom-view/

他们使用矩阵和画布缩放你的视图。使用起来很简单你可以将java文件从仓库复制到你的项目中然后添加到你的xml视图中,像这样

<yourpackagename.ZoomvView>
     //place your view that want to be zoomed here
</yourpackagename.ZoomvView>

很抱歉问一个问题,但如果你遇到这个错误自定义视图ZoomView没有使用2或3个参数的视图构造函数;XML属性不能工作"

将这些添加到java类ZoomView

public ZoomView(Context Context, AttributeSet AttributeSet)

{超级(上下文,attributeSet);

//TODO:

}

最新更新