19

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

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; 
      } 
      }); 
+0

のために代わりにあなたのレイアウトファイルに次のコードを使用することができます画像に?なぜ元のイメージを別のビットマップに保存しないのですか?ユーザーがズームを使用しているときに拡大鏡効果を取り除くときは、元のビットマップを使用してキャンバスに再描画し、ズームで画像を消去します。 –

+0

いいえイメージビュー上に拡大円が表示されません。あなたはもっと何かを共有してくださいか、クラスはどこで動作していますか? –

+0

ギャラリーの中心にある透明なオーバーレイフレームで画像をズームする必要があるので、画像が通過するとズームするようにしてください。 – Ravi

答えて

16

コードを変更することで、次のようなアプローチが可能になりました。 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の方法では、 hereが説明するように、シェーダのために、私は、ビットマップシェーダを使用して作成されたことを

@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); 
+0

よろしくお願いします。これは間違いなく助けてくれます。 –

+0

@qzikl、もっと詳しく教えてください? onDrawメソッドを宣言する場所とここに行列が書ける場所を書くことができますか? –

+0

ちょっと、上記のコードをありがとうございます。いくつかの固定位置で拡大表示を拡大表示する方法はありますか? –

6

画像に加えられた変更を元に戻す最も良い方法は、ソースファイルから画像をリロードすることです。あるいは、変換開始前にコピー元の行列変数を保持しておいて、MotionEvent.ACTION_UPの元の行列をロードしてください。

0

カスタムイメージビューを使用して実装できます。パッケージにクラスCodesforMagnifierImageView.javaを作成します。あなたは、私はそれが正しい理解ができますが、ズーム効果をクリアする方法を求めている場合、私は知らない​​で、各クラスのコードを見て、単にImageViewの

<com.yourpackage.CodesforMagnifierImageView 
    android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/your image" /> 
関連する問題