【问题标题】:Stop rotation of image after 360' degree360 度后停止图像旋转
【发布时间】:2012-07-05 09:06:46
【问题描述】:

我正在尝试将图像从其中心点旋转一圈,但我无法在所需位置停止,因为我可以进行旋转,但我想在 360'(1 round) 之后停止旋转。

public class RotateRoundActivity extends Activity implements OnTouchListener
{

    private ImageView dialer;
    //private float y=0;
    private float x=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        dialer = (ImageView) findViewById(R.id.big_button);
        dialer.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    //  double r=Math.atan2(event.getX()-dialer.getWidth()/2, dialer.getHeight()/2-event.getY());

        double r=Math.atan2(event.getX()-dialer.getWidth()/2, dialer.getHeight()/2-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;
    }

轮换法@

    private void updateRotation(double rot){
        float newRot=new Float(rot);
        Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
        Matrix matrix=new Matrix();
        matrix.postRotate(newRot,bitmap.getWidth(),bitmap.getHeight());
        Log.i("demo===>", "matrix==>" + matrix);
     //   Log.i("demo===", "y===>" + y);
        Log.i("demo===", "x===>" + x);

        if(x>250){
            Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
            dialer.setImageBitmap(reDrawnBitmap);
        }
        else{
            Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
            dialer.setImageBitmap(reDrawnBitmap);
        }
    }

}

您的建议很重要。

【问题讨论】:

  • 您要旋转哪个方向?我的意思是顺时针/逆时针?
  • 顺时针和逆时针方向。

标签: android rotational-matrices


【解决方案1】:

您必须保存以前的 rot 值。并在updateRotation 方法中添加检查,如果previousRot 在 360' 度的左侧,rot 在 360' 度的右侧,那么我们做了 1 轮,需要停止旋转。

顺时针的示例代码

if (previousRot >= 300 && previousRot <= 360 && rot >= 0 && rot <= 60) {
    rot = 359.99; // or here can be 360'
}

逆时针方向的情况几乎相同,但交换了值

if (previousRot >= 0 && previousRot <= 60 && rot >= 300 && rot <= 360) {
    rot = 0;
}

此代码将停止旋转。从一开始previousRot 应该是 0 顺时针方向和 359.99 逆时针方向


另一种方法是再添加一个变量来存储总行驶角度。从一开始,traveledAngle 必须等于 0。如果您以顺时针方向旋转,则必须将其增加 rotpreviousRot 之间的差值。逆时针旋转时减少相同的值。

traveledAngle += rot - previousRot;

traveledAngle大于360'时停止顺时针旋转,小于0时停止逆时针旋转。

【讨论】:

  • 如何获得超过 360' 度的角度?它将从 1' 增加到 360'。 360' 后需要 1' 度。
  • 没错!对于顺时针方向,previousRot 应该是 350-360',rot 应该是大约 0-10'。但是这个数字只是举例,它可能是 300-360' 和 0-60'。主要思想是使用previousRot
  • 好的。但是如何使用 previousRot 停止旋转?如果我在一次旋转后处于 1' 并且我的 previousRot 值为 360' 那么?逆时针的逻辑应该是什么?
  • 添加了另一种使用traveledAngle解决问题的方法
  • 我喜欢你关于 traveledAngle 和 rot angle 的概念和逻辑。在您发表评论后两天,我一直在尝试解决停止轮换的问题。我几乎得到了这个问题的解决方案。谢谢。
【解决方案2】:

我已经使用了你的demo并添加了一些逻辑,较新的demo如下:

public class RotateRoundActivity extends Activity implements OnTouchListener {
    float rot1=0.0F, rot2=0.0F;
    boolean clockwise, rotationDone = false, halfrotated = false;
    int rotcall=0;

    private ImageView dialer;
    //private float y=0;
    private int x=0;
    //private int y=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        dialer = (ImageView) findViewById(R.id.big_button);
        dialer.setOnTouchListener(this);
    }

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

        return true;
    }

    private void updateRotation(double rot){
        float newRot = new Float(rot);

        rotcall++;
        if(rotcall == 1)
            rot1 = new Float(rot);
        if(rotcall == 2)
            rot2 = new Float(rot);
        if(rot1 != 0.0F && rot2 != 0.0F)
            if(rot1 < rot2)
                clockwise = true;
            else
                clockwise = false;
        System.out.println("Rotate :: "+newRot);

        if(clockwise && rot1>=0 ) {
            if(newRot < 0)
                halfrotated = true;
            if(halfrotated && newRot > 0)
                rotationDone = true;
            if(rotationDone)
                newRot = 0;
        }
        if(clockwise && rot1<0) {
            if(newRot > 0)
                halfrotated = true;
            if(halfrotated && newRot < 0)
                rotationDone = true;
            if(rotationDone)
                newRot = 0;
        }
        if(!clockwise && rot1<0) {
            if(newRot > 0)
                halfrotated = true;
            if(halfrotated && newRot < 0)
                rotationDone = true;
            if(rotationDone)
                newRot = 0;
        }
        if(!clockwise && rot1>=0) {
            if(newRot < 0)
                halfrotated = true;
            if(halfrotated && newRot > 0)
                rotationDone = true;
            if(rotationDone)
                newRot = 0;
        }

        System.out.println("Rotation Done :: "+rotationDone);

        if(!rotationDone) {
            //BitmapDrawable bitmapDrawable = (BitmapDrawable) dialer.getDrawable();
            //Bitmap bitmap = bitmapDrawable.getBitmap();
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                    R.drawable.  YOUR_DRBL  );
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            Matrix matrix = new Matrix();
            matrix.postRotate(newRot, width, height);
            System.out.println("x===>" + x);
            //System.out.println("y===>" + y);

            //if (x > 250) {
                Bitmap reDrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
                dialer.setImageBitmap(reDrawnBitmap);
            /*} else {
                Bitmap reDrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                        width, height, matrix, true);
                dialer.setImageBitmap(reDrawnBitmap);
            }*/
        }
    }

}

【讨论】:

  • 有 2 个副作用。 1.]从左半部分开始顺时针旋转或 2.]从右半部分开始逆时针旋转。在这两种情况下,它都会将图像旋转 1.5 圈。到目前为止,这是我的逻辑限制。如果我会更新它,我会通知你。
  • @Maulik,如果您尝试我的演示并遇到任何问题,请在此处发表评论通知我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2019-08-09
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多