22

ユーザーが画像に触れられるようにしようとしていますが、基本的に円形の拡大鏡が表示され、ユーザーが画像上の特定の領域をより適切に選択できるようになります。ユーザーがタッチを離すと、拡大部分が消えます。これはいくつかの写真編集アプリで使用されており、独自のバージョンを実装しようとしています。以下のコードは、イメージビューの円形部分を拡大しますが、指を離してもズームを削除またはクリアしません。現在、ビットマップを使用してキャンバスに設定してから、使用しcanvas = new Canvas(bitMap);てイメージビューを設定してtakenPhoto.setImageBitmap(bitMap); います。正しい方法で行っているかどうかわかりません。onTouch コードは次のとおりです。

zoomPos = new PointF(0,0);
        takenPhoto.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                 int action = event.getAction(); 
                    switch (action) { 
                        case MotionEvent.ACTION_DOWN: 
                            zoomPos.x = event.getX();
                            zoomPos.y = event.getY();
                            matrix.reset();
                            matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);
                            shader.setLocalMatrix(matrix);
                            canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint);
                            takenPhoto.invalidate();
                            break; 
                        case MotionEvent.ACTION_MOVE: 
                            zoomPos.x = event.getX();
                            zoomPos.y = event.getY();
                            matrix.reset();
                            matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);
                            canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint);
                            takenPhoto.invalidate();
                            break; 
                        case MotionEvent.ACTION_UP:   
                            //clear zoom here?

                            break; 
                        case MotionEvent.ACTION_CANCEL: 
                            break; 
                        default: 
                            break; 
            }
                    return true; 
            } 
            });
4

4 に答える 4

18

あなたのコードを適応させて、次のアプローチを機能させることができました。

onTouch 関数で、ユーザーがどこに触れたかを判断するためのグローバル ポイントを設定し、ズームが現在アクティブかどうかを示すブール値を設定します。

@Override
public boolean onTouch(View view, MotionEvent event) {

    int action = event.getAction(); 

    zoomPos.x = event.getX();
    zoomPos.y = event.getY();

    switch (action) { 
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_MOVE:
        zooming = true;
        this.invalidate();
        break; 
    case MotionEvent.ACTION_UP:   
    case MotionEvent.ACTION_CANCEL:
        zooming = false;
        this.invalidate();
        break; 

    default: 
        break; 
    }

    return true; 
}

次に、onDraw メソッドで、コードを使用して拡大部分を描画します。

@Override
protected void onDraw(Canvas canvas) {

    super.onDraw(canvas);

    if (zooming) {
        matrix.reset();
        matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);
        mPaint.getShader().setLocalMatrix(matrix);

        canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint);
    }
}

シェーダーについては、こちらで説明されているようにビットマップ シェーダーを使用したことに注意してください。

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
mShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);

mPaint = new Paint();
mPaint.setShader(mShader);
于 2012-12-20T18:51:12.223 に答える
6

イメージに加えられた変更を元に戻す最良の方法は、ソース ファイルからイメージをリロードすることです。または、変換が開始される前MotionEvent.ACTION_UP、元の行列の読み込み中に元の行列変数のコピーを保持します。

于 2012-12-20T11:01:12.413 に答える