如何在android中使用修复点和触摸旋转图像

时间:2010-12-27 13:12:58

标签: android

我一直在寻找解决这个问题的一天,但没有任何帮助,即使这里的答案也没有帮助我。 我的问题是我的图像正在旋转但位图大小在旋转时没有变化。

这是我的代码

package dharam.rotate;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Event;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;

public class Rotate extends Activity {
    View baseView ;
    ImageView turntable;
    TextView bottomText;
    GestureDetector   gestureDetector;
    private float x , y;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    baseView = (View) findViewById(R.id.baseView);
    turntable = (ImageView) findViewById(R.id.turntable);

    turntable.setOnTouchListener(onTableTouched);
    baseView.setOnTouchListener(onTableTouched);
}

public android.view.View.OnTouchListener onTableTouched = new android.view.View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent evt) {
        double r = Math.atan2(evt.getX() - turntable.getWidth() / 2,
                (turntable.getHeight() / 2) - evt.getY());
        int rotation = (int) Math.toDegrees(r);
        Log.i("R is ", ""+r);
        if (evt.getAction() == MotionEvent.ACTION_DOWN) {
        }

        if (evt.getAction() == MotionEvent.ACTION_MOVE) {
            x= evt.getX();
            y= evt.getY();
            updateRotation(rotation);
        }

        if (evt.getAction() == MotionEvent.ACTION_UP) {
                //
        }
        return true;
    }
};
private void updateRotation(double rot) {
    float newRot = new Float(rot);
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
    R.drawable.orsl_circle_transparent);
    Matrix matrix = new Matrix();
//        matrix.setTranslate(getWindowManager().getDefaultDisplay().getWidth()/2, getWindowManager().getDefaultDisplay().getHeight());
        matrix.postRotate(newRot,bitmap.getWidth()/2,bitmap.getHeight()/2);
//      matrix.setSinCos(newRot, newRot/2, 100, 100);
//      matrix.postRotate(newRot);
        Log.i("THE ROATTION ", "  "+    newRot);

    if(y>250)
    {
        Bitmap redrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap
                .getWidth(), bitmap.getHeight(), matrix, true);
        turntable.setImageBitmap(redrawnBitmap);
    }else
    {
        Bitmap  redrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap
                .getWidth(), bitmap.getHeight(), matrix, true);
         turntable.setImageBitmap(redrawnBitmap);
         Log.i("GUITAR _IMAGE", "");
    }

}

}

2 个答案:

答案 0 :(得分:1)

我认为您想要在用户触摸屏幕的位置旋转图像?如果是这样,请扩展SimpleOnGestureListener,如下例所示:

public class MyGestureDetector extends SimpleOnGestureListener
{       

    @Override
    public void onLongPress(MotionEvent event)
    {
        int X = (int)event.getX();          
        int Y = (int)event.getY();

        ...Rotate the image
    }
}

获得触摸事件的屏幕坐标后,您可以应用关于该点的旋转动画 - 有关详细信息,请参阅此处:http://developer.android.com/guide/topics/graphics/2d-graphics.html

答案 1 :(得分:1)

我检查了你的代码只是没有采用baseview,它工作正常。这是我的代码,它在我的模拟器中工作正常。

package com.android.practice;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

 public class JobSearch extends Activity implements OnTouchListener {

private ImageView dialer;
private float y=0;
public boolean onTouch(View v, MotionEvent event) {
    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;

}//onTouch
private void updateRotation(double rot){
    float newRot=new Float(rot);
    Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.round_button_big);
    Matrix matrix=new Matrix();
    matrix.postRotate(newRot,bitmap.getWidth()/2,bitmap.getHeight()/2);
    if(y>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);
    }
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    dialer = (ImageView) findViewById(R.id.big_button);
    dialer.setOnTouchListener(this);
}//onCreate
}