안녕하세요~
터치해서 움직이면 움직이는 각도로 이미지가 회전하는 커스텀 뷰를 만들었습니다.
그런데 퍼포먼스가 생각만큼 안나와서요.
혹시 잘못된부분이라던지
좋은방향 있으면 지적좀 해주시면감사하겠습니다~
아래는 코드입니다.
public class ImageRotate_C extends View {
private final String TAG = "ImageRotate_c";
private Matrix m;
private Canvas c;
private Bitmap b, rbmp, tbmp;
private Resources r;
private int id, w, h;
public ImageRotate_C(Context context) {
super(context);
m = new Matrix();
c = new Canvas();
}
public void ImageSetInit(Resources _r, int _id) {
r = _r;
id = _id;
b = BitmapFactory.decodeResource(r, id);
w = b.getWidth();
h = b.getHeight();
}
public void ImageRotate(float degree) {
rbmp = Bitmap.createBitmap(b, 0, 0, w, h, m, false);
m.setRotate(degree);
tbmp = Bitmap.createBitmap(w, h, Config.RGB_565);
c.setBitmap(rbmp);
c.drawBitmap(tbmp, w / 2 - tbmp.getWidth() / 2, h / 2 - tbmp.getHeight() / 2, null);
this.invalidate();
}
public void onDraw(Canvas canvas) {
canvas.drawBitmap(rbmp,0,0,null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
int x = (int) event.getX();
int y = (int) event.getY();
int dx = x - (w / 2);
int dy = y - (h / 2);
float radian = (float) (Math.atan2(dx, dy)); // PI
float degree = 180 - (float) Math.toDegrees(radian);
Log.i(TAG, "d :" + degree);
switch (action) {
case MotionEvent.ACTION_UP:
// 각도 저장;
// degree
return true;
case MotionEvent.ACTION_DOWN:
ImageRotate(radian);
return true;
case MotionEvent.ACTION_MOVE:
ImageRotate(degree);
return true;
}
return true;
}
public void onDestroy() {
rbmp.recycle();
rbmp = null;
}
}
음...... 일단 비트맵을 생성만 줄기차게 하시고 recycle() 를 해주지 않으셨네요.
이전 비트맵을 변수에 저장하고 새 비트맵을 지정해 주고 나면 해제를 시켜줘야 합니다.
비슷한거 만들어 본 기억으로는... 굳이 canvas를 사용하지 않고
ImageView를 상속받아서 만들었던 기억이 납니다.
int rotateWidth = getWidth() / 2;
int rotateHeight = getHeight() / 2;
float degrees = -(distance / decelator);
currentDegrees = currentDegrees + degrees;
Matrix m = new Matrix();
m.setRotate(currentDegrees, rotateWidth, rotateHeight);
setImageMatrix(m);




아마 안드로이드 프레임워크에서 UI 처리부분 문제라고..부드럽게 하실려면 그냥 OpenGL 사용하심이....