资讯专栏INFORMATION COLUMN

关于android实现拖动旋转角度,调整布局参数的思路

Shonim / 2953人阅读

摘要:我想做一个视图跟随我的手指和做一些旋转和缩放在多点触控用下面的代码一切都顺利直到测试到视图旋转。在我做这个转变的活动手指原文地址

我想做一个视图跟随我的手指和做一些旋转和缩放在多点触控用下面的代码

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    final int action = motionEvent.getActionMasked();
    int newPosX,newPosY;
    switch (action) {
        case MotionEvent.ACTION_DOWN: {
            final int pointerIndex = motionEvent.getActionIndex();
            final float x = motionEvent.getX( pointerIndex);
            final float y = motionEvent.getY( pointerIndex);
            RelativeLayout.LayoutParams parms = (RelativeLayout.LayoutParams) view.getLayoutParams();
            // Remember where we started (for dragging)
            mLastTouchX = (int) x;
            mLastTouchY = (int) y;
            // Save the ID of this pointer (for dragging)
            mActivePointerId = motionEvent.getPointerId( 0);
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            if(motionEvent.getPointerCount()==2){
                float newDist = spacing(motionEvent);
                float scale = newDist / oldDist * view.getScaleX();
                view.setScaleY(scale);
                view.setScaleX(scale);
                float newAngle = rotation(motionEvent);
                float a = newAngle - oldAngle;
                view.animate().rotationBy(a).setDuration(0).setInterpolator(new LinearInterpolator()).start();
            }
            // Find the index of the active pointer and fetch its position
            final int pointerIndex =
                    motionEvent.findPointerIndex( mActivePointerId);
            final float x = motionEvent.getX( pointerIndex);
            final float y = motionEvent.getY( pointerIndex);
            // Calculate the distance moved
            final float dx = x - mLastTouchX;
            final float dy = y - mLastTouchY;
            RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
            layoutParams.leftMargin += dx;
            layoutParams.topMargin += dy;
            view.setLayoutParams(layoutParams);
            break;
        }
        case MotionEvent.ACTION_POINTER_DOWN:{
            oldDist = spacing(motionEvent);
            oldAngle = rotation(motionEvent);
            break;
        }
        case MotionEvent.ACTION_UP: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }
        case MotionEvent.ACTION_CANCEL: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }
        case MotionEvent.ACTION_POINTER_UP: {
            final int pointerIndex = motionEvent.getActionIndex();
            final int pointerId = motionEvent.getPointerId( pointerIndex);
            if (pointerId == mActivePointerId) {
                // This was our active pointer going up. Choose a new
                // active pointer and adjust accordingly.
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mLastTouchX = (int) motionEvent.getX( newPointerIndex);
                mLastTouchY = (int) motionEvent.getY( newPointerIndex);
                mActivePointerId = motionEvent.getPointerId( newPointerIndex);
            }
            break;
        }
    }
    return true;
}
    private float spacing(MotionEvent event) {
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    return (float) Math.sqrt(x * x + y * y);
}
private float rotation(MotionEvent event) {
    double delta_x = (event.getX(0) - event.getX(1));
    double delta_y = (event.getY(0) - event.getY(1));
    double radians = Math.atan2(delta_y, delta_x);
    return (float) Math.toDegrees(radians);
}


    一切都顺利直到测试到视图旋转。当它旋转90度以上的时候,我们试着将它拖它跳跃的触摸点。我认为这件事与

LayoutParams。左边界+=DXLayoutParams。左边空白+=Dysetlayoutparams(LayoutParams)

这段代码有关,我测试了两天都没有成功!

注:我想实现的是使视图拖动旋转和2指量表(拖单指也) 我代码来自谷歌的跟随拖动文件使它不跳时,开关的手指。 我使用这个旋转 视图。animate() rotationby(一)。。setDuration(0)。setinterpolator(新linearinterpolator())

因为当我使用视图。setrotate(),视图是振动。

方法1:我删除了

layoutParams.leftMargin += dx;
layoutParams.topMargin += dy;
setLayoutParams(layoutParams);

这段代码……

然后取而代之的是:

layoutParams.leftMargin += dx;
layoutParams.topMargin += dy;

这段代码

现在即使旋转视图不走动。但当我切换活动手指跳跃从实际位置。

在action_pointer_up我做这个转变的活动手指

//To get the moved distance of the finger(X and Y)
float diffX = motionEvent.getX(pointerIndex) - mLastTouchX;
                    float diffY = motionEvent.getY(pointerIndex) - mLastTouchY;
//to get the distance from touch point and the top or left of the view
                    final float dx = motionEvent.getRawX() - (motionEvent.getRawX()-motionEvent.getX());
                    final float dy = motionEvent.getRawY() - (motionEvent.getRawY()-motionEvent.getY());
                    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
//Settings appropriate value for the margin top and margin left.
                    layoutParams.leftMargin = (int) ((( motionEvent.getRawX() )-dx )+ diffX );
                    layoutParams.topMargin = (int) ((( motionEvent.getRawY() )-dy )+ diffY );


case MotionEvent.ACTION_POINTER_UP: {
                final int pointerIndex = motionEvent.getActionIndex();
                final int pointerId = motionEvent.getPointerId( pointerIndex);
                if (pointerId == mActivePointerId) {
                    // This was our active pointer going up. Choose a new
                    // active pointer and adjust accordingly.
                    final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                    Log.d(TAG,+newPointerIndex);
                    mLastTouchX = (int) motionEvent.getX( newPointerIndex);
                    mLastTouchY = (int) motionEvent.getY( newPointerIndex);
                    mActivePointerId = motionEvent.getPointerId( newPointerIndex);
                }
                break;
            }

原文地址:http://www.apkbus.com/blog-91...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14029.html

相关文章

  • 鸿蒙开源第三方组件——SwipeCaptcha_ohos3.0旋转验证组件

    摘要:步骤设置控件监听事件,重新生成验证区域在文件中添加控件在文件中添加控件,用于显示旋转验证的动态效果。先实例化一个随机数对象,用于后续计算随机生成的旋转验证块角度值。 前言基于安卓平台的滑动拼## 二级标题图验证组件SwipeCaptcha(https://github.com/mcxtzhang/SwipeCa...

    Amos 评论0 收藏0
  • 完整视频播放器封装库

    摘要:可以支持多种视频播放类型,比如,原生封装视频播放器,还有基于封装的播放器。并且还支持删除视频播放位置状态。拓展功能产品需求类似优酷,爱奇艺视频播放器部分逻辑。 目录介绍 1.关于此视频封装库介绍 1.1 能够满足那些业务需求 1.2 对比同类型的库有哪些优势 2.关于使用方法说明 2.1 关于gradle引用说明 2.2 添加布局 2.3 最简单的视频播放器参数设定 2.4 注意的问...

    feng409 评论0 收藏0
  • 完整视频播放器封装库

    摘要:可以支持多种视频播放类型,比如,原生封装视频播放器,还有基于封装的播放器。并且还支持删除视频播放位置状态。拓展功能产品需求类似优酷,爱奇艺视频播放器部分逻辑。 目录介绍 1.关于此视频封装库介绍 1.1 能够满足那些业务需求 1.2 对比同类型的库有哪些优势 2.关于使用方法说明 2.1 关于gradle引用说明 2.2 添加布局 2.3 最简单的视频播放器参数设定 2.4 注意的问...

    mingde 评论0 收藏0
  • Android三种姿势带你玩转360度全景图功能

    摘要:注册陀螺仪传感器首先注册陀螺仪传感器根据具体需要自己设置灵敏度,当然越灵敏,越耗电。注册陀螺仪传感器,并设定传感器向应用中输出的时间间隔类型是微秒微秒最快。 简介 大家好我是张鹏辉(道长)人如其名,我是天桥上算命的,转发这条博文,接下来一个月会有意想不到的惊喜发生。最近微博上的全景图火了,所以决定实现一下。 工程里面图片资源来自网络,如有侵权请联系我,马上删除当然实现的方式很多比如Op...

    seal_de 评论0 收藏0
  • Android三种姿势带你玩转360度全景图功能

    摘要:注册陀螺仪传感器首先注册陀螺仪传感器根据具体需要自己设置灵敏度,当然越灵敏,越耗电。注册陀螺仪传感器,并设定传感器向应用中输出的时间间隔类型是微秒微秒最快。 简介 大家好我是张鹏辉(道长)人如其名,我是天桥上算命的,转发这条博文,接下来一个月会有意想不到的惊喜发生。最近微博上的全景图火了,所以决定实现一下。 工程里面图片资源来自网络,如有侵权请联系我,马上删除当然实现的方式很多比如Op...

    DevTalking 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<