View缩放后上面绘制的坐标点的新坐标怎么计算?

Souja 2018-03-26 04:23:52
在一个View的onDraw里面,

根据传入的坐标(例如:(100,100))绘制一些点,

然后View的Ontouch事件里面,双指对view进行缩放,然后计算出缩放率(比如缩放了2倍:2f),

现在问题是:算出缩放率后怎么计算绘制的点的最新坐标?

因为缩放时,中心点是变化的,所以直接用缩放率和点的坐标相乘是不行的~


因为点的坐标后面还需要用到其他地方,所以必须要计算出坐标,不然就直接缩放canvas了~~


或者有其他方法实现吗(根据坐标画一些点,再缩放)~求大神指点~跪谢!

...全文
953 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
x443137254 2018-03-28
  • 打赏
  • 举报
回复
基本算法其实很简单,就是以2指中点缩放,得到一个新的view,这个view的左上角就是原来view的左上角坐标*缩放比,有了这个点的坐标应该你要的那个点的位置不难求,也就是比例的问题,当然用矩阵那个类是最直接的
lanqilovezs 2018-03-27
  • 打赏
  • 举报
回复
所有的捏合旋转都对matrix操作,然后在onDraw里对canvas使用matrix进行变换。 大概的代码是这样子的

    @Override
    public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    lastPoint.set(event.getX(), event.getY());
                    break;
                case MotionEvent.ACTION_UP:
                    break;

                case MotionEvent.ACTION_POINTER_DOWN:
                    isPinch = true;
                    lastSpace = pinchSpace(event);
                    lastRotate = pinchRotation(event);
                    lastPoint = pinchCenter(event);
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    isPinch = false;
                    break;
                case MotionEvent.ACTION_MOVE:
                    PointF point = new PointF(event.getX(), event.getY());
                    if (isPinch)  {
                        float space = pinchSpace(event);
                        float rotate = pinchRotation(event);
                        PointF center = pinchCenter(event);

                        matrix.postScale(space / lastSpace, space / lastSpace, center.x, center.y);
                        matrix.postRotate(rotate - lastRotate, center.x, center.y);

                        lastSpace = space;
                        lastRotate = rotate;
                        point = center;
                    }
                    float dx = point.x - lastPoint.x;
                    float dy = point.y - lastPoint.y;
                    lastPoint = point;
                    matrix.postTranslate(dx, dy);
                    invalidate();
                    break;
            }
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mBitmap == null) {
            return;
        }
        canvas.concat(matrix);
        canvas.drawBitmap(mBitmap, 0, 0, mPaint);
        drawOrigin(canvas);
    }

    private void drawOrigin(Canvas canvas) {
        if (mOrigin != null) {
            drawArrow(canvas, (float) mOrigin.x, (float) mOrigin.y, 50, (float) mOrigin.t, Color.RED);
        }
    }
开发者_android 2018-03-27
  • 打赏
  • 举报
回复
还有,getMatrix()也应该可以获取到吧
开发者_android 2018-03-27
  • 打赏
  • 举报
回复
缩放后,getLocationOnScreen不能获取到它的location吗?

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧