0

私は OnTouchListener を設定した ImageView を持っており、指のジェスチャーでドラッグして回転させることができます。私の問題は回転に伴います。実際のコードでそうすると、添付の図に示すように、ビットマップが期待どおりに回転しますが、以前のバージョンがオーバーレイされます。なぜこれが起こっているのか誰にも分かりますか?ありがとう。

//Touch event related variables
int touchState;
final int IDLE = 0;
final int TOUCH = 1;
final int PINCH = 2;
float dist0, distCurrent;
float angle;

public boolean onTouch(View view, MotionEvent event) {
    boolean handledHere = false;

    float distx, disty;

    final int action = event.getAction();

    switch(action & MotionEvent.ACTION_MASK){
    case MotionEvent.ACTION_DOWN:
        //A pressed gesture has started, the motion contains the initial starting location.
        touchState = TOUCH;
        break;
    case MotionEvent.ACTION_POINTER_DOWN:
        //A non-primary pointer has gone down.
        touchState = PINCH;

        //Get the distance when the second pointer touch
        distx = event.getX(0) - event.getX(1);
        disty = event.getY(0) - event.getY(1);
        dist0 = FloatMath.sqrt(distx * distx + disty * disty);

        break;
    case MotionEvent.ACTION_MOVE:
        //A change has happened during a press gesture (between ACTION_DOWN and ACTION_UP).

        if(touchState == PINCH){                        
            //Get the current distance
            distx = event.getX(0) - event.getX(1);
            disty = event.getY(0) - event.getY(1);
            distCurrent = FloatMath.sqrt(distx * distx + disty * disty);

            // use angle to rotate view
            angle = getDegreesFromRadians((float) (Math.atan(disty/distx)));
            Log.i("Angle of rotation", angle + "");

            drawMatrix((ImageView) view);

        } else {
            handledHere = startDrag (view);
        }

        break;
    case MotionEvent.ACTION_UP:
        //A pressed gesture has finished.
        touchState = IDLE;
        break;
    case MotionEvent.ACTION_POINTER_UP:
        //A non-primary pointer has gone up.
        touchState = TOUCH;
        break;

    }

    return handledHere;
}

    private void drawMatrix(ImageView view){
    float curScale = distCurrent/dist0;

    if (curScale < 0.5){
        curScale = 0.5f;    
    } else if (curScale > 1.5){
        curScale = 1.2f;
    }

    Bitmap originalBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); //view.getDrawingCache();
    Canvas canvas = new Canvas(originalBitmap);
    view.draw(canvas);
    int[] originalSize = (int[]) view.getTag();
    int newHeight = (int) (originalSize[1] * curScale); //(view.getHeight() * curScale);
    int newWidth = (int) (originalSize[0] * curScale); //(view.getWidth() * curScale);

    view.setImageBitmap(getResizedBitmap(originalBitmap, newHeight, newWidth));

}

private Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // create a matrix for the manipulation
    Matrix matrix = new Matrix();
    // rotate the bipmap
    matrix.postRotate(angle);
    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
    return resizedBitmap;
}

画像の回転

4

2 に答える 2

0

ImageView.setScaleType(MATRIX) を使用して、Matrix メソッドで遊んでみませんか。Matrix を使用してスケーリング、移動、回転することもできます。

于 2012-11-08T10:36:25.287 に答える
0

回転した画像を描画する前に、キャンバスをクリアする必要があると思います。

で をインスタンス化しcanvas、画像を描画する直前にconstructorを適用しますPorterDuff

Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawPaint(paint);
于 2012-11-08T09:23:14.200 に答える