Android,帮助旋转触摸图像

标签 android bitmap touch rotation motion

我正在尝试在此图像上旋转其中一个透明 PNG。数字部分是我要旋转的部分。我能够做到这一点,但这不是我想要实现的目标

我想像在真正的组合锁上那样旋转数字。因此,用户将触摸并在圆圈内移动他们的手指。我查看了触摸/移动事件中不太精确的图像旋转,但它们还不够。

这是我目前的代码

 public boolean onTouch(View v, MotionEvent event) {
    double r=Math.atan2(event.getX()-lockNumbers.getWidth(), lockNumbers.getHeight()-event.getY());
    int rotation=(int)Math.toDegrees(r);
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_MOVE:
            x=event.getX();
            y=event.getY();
            updateRotation(rotation);
            break;
        case MotionEvent.ACTION_UP:
            break;
    }//switch       

    return true;

}//onTouch
private void updateRotation(double rot){
    float newRot=new Float(rot);
    Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.numbers);
    Matrix matrix=new Matrix();
    matrix.postRotate(newRot,bitmap.getWidth(),bitmap.getHeight());
    if(y>250){
        Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
        lockNumbers.setImageBitmap(reDrawnBitmap);
    }
    else{
        Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
        lockNumbers.setImageBitmap(reDrawnBitmap);
    }
}

由于矩阵参数,它还会在您触摸位图时调整位图的大小。这不是预期的效果。

用户几乎需要用手指绕圈。

最佳答案

将以下代码写入您的触摸事件。

switch (event.getAction()) {    
    case MotionEvent.ACTION_DOWN:
        // reset the touched quadrants
        for (int i = 0; i < quadrantTouched.length; i++) {
            quadrantTouched[i] = false;
        }
        allowRotating = false;
        startAngle = getAngle(event.getX(), event.getY());
        break;
    case MotionEvent.ACTION_MOVE:
        double currentAngle = getAngle(event.getX(), event.getY());
        rotateDialer((float) (startAngle - currentAngle));
        startAngle = currentAngle;
        break;
    case MotionEvent.ACTION_UP:
        allowRotating = true;
        break;
}

// set the touched quadrant to true
quadrantTouched[getQuadrant(event.getX() - (dialerWidth / 2), dialerHeight - event.getY() - (dialerHeight / 2))] = true;
detector.onTouchEvent(event);
return true;

并使用以下链接获取更多引用。

Rotate Dialer Example

关于Android,帮助旋转触摸图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11405466/

相关文章:

android - 使用可绘制资源

ios - 从图像获取触摸坐标,同时保持平移/缩放功能

android - 在android模拟器中安装操作系统

android - 清除 Activity 堆栈并从 Android 服务启动新 Activity

android - 如何获取 callLog.calls 中最频繁的值条目的数量?

c# - 将 Bitmap 对象保存为 jpeg 时的 "A generic error occurred in GDI+",c#

c# - System.Drawing.Image 数据在保存到文件和流之间是不同的

java - 编辑 PullToRefresh ListView 以从底部刷新

touch - 如何从 Sencha Touch 2 中的字段集获取数据?

ios - 如何定义 pin 的触摸区域(Skobbler iOS)