2017-10-08 10 views
0

キャンバスを使用してビットマップを描画し、imageViewで覆われたビットマップを設定します。Androidキャンバスが別の方法でビットマップに描画しない

drawGraph()というメソッドで基本的な描画を描画しています。ユーザーがキャンバスに触れると、そこに円を描く必要があります。そのためにonTouchEvent()メソッド内にキャンバスを使用しています。 、コードは以下の通りですが、問題は何ですか?どうすれば解決できますか?

もう一つのビットマップを直線で作成しようとしましたが、drawGraph()とcheckClicked()の最後に新しいビットマップをimageViewに設定しました。新しいビットマップ(直線を描く)が最初は正しくimageViewに設定されていますが、imageViewをクリックすると空白のビットマップ(直線を描画しない)がimageViewに設定されます。だから、キャンバスドローはcheckClicked()で動作しないと確信しています。

事前にお手伝いいただきありがとうございます。

ImageView imageView; 

Paint p = new Paint(); 
Bitmap myBitmap; 
Bitmap workingBitmap; 
Bitmap mutableBitmap; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img_drawpanel); 
    workingBitmap = Bitmap.createBitmap(myBitmap); 
    mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); 

    imageView = (ImageView) findViewById(R.id.image1); 

    imageView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      int touchX = (int) (event.getX() + imageView.getX()); 
      int touchY = (int) (event.getY() + imageView.getY()); 

      checkClicked(touchX, touchY); 

      return true; 
     } 
    }); 

    drawGraph(); 
} 

public void drawGraph(){ 

    p.setAntiAlias(true); 
    p.setColor(Color.BLACK); 
    p.setStyle(Style.FILL_AND_STROKE); 
    p.setStrokeWidth(5); 

    Canvas canvas = new Canvas(mutableBitmap); 

    //basic drawing is successfully drawn here 

    imageView.setAdjustViewBounds(true); 
    imageView.setImageBitmap(mutableBitmap); 

} 

public void checkClicked(int x, int y){ 

    p.setAntiAlias(true); 
    p.setColor(Color.RED); 
    p.setStyle(Style.FILL_AND_STROKE); 

    Canvas canvas = new Canvas(mutableBitmap); 

    //canvas doesn't draw a circle here 
    canvas.drawCircle(x, y, 10, p); 

    imageView.setAdjustViewBounds(true); 
    imageView.setImageBitmap(mutableBitmap); 

答えて

0

間違った位置に描画されています。ビュー内の座標は、ビットマップ内の座標と同じではないためです。

イメージビューからタッチし、指を画面の左上部分にドラッグすることで確認できます。

画面と画像ビューの縮尺と訳を取得し、描画する前に座標を変換する必要があります。

imageView.getImageMatrix()を使用すると、画像の変換を含むimageViewの描画行列を取得し、それに応じて計算を行うことができます。

+0

私は座標を変換しました: int =(int)(drawPanel.getX()+ x); int b =(int)(drawPanel.getY()+ myBitmap.getHeight() - y); drawGraph()関数では正常に動作し、同じルールがcheckClicked()関数に適用されません。 drawPanel.getX()とdrawPanel.getY()は関数間で変更しますか? 私を助けてください!ありがとう! – philwu

+0

imageViewをクリックするとdrawGraph()関数が呼び出されます。 drawGraph()は、図面の上半分しか見ることができないので、imgaeViewの範囲から基本的な図面を再描画します。 – philwu

関連する問題