2012-12-13 17 views
9

私は自分のビュー(R.id.view)でペイントしていますが、このコードは効果がないようです。私は何も描くことができません。Android - ビューを描画する方法

public class MainActivity extends Activity implements OnTouchListener 
     { 
Path mPath; 
Canvas canvas; 
Paint mPaint; 
MaskFilter mEmboss; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     View view=(View)findViewById(R.id.view1); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFFFF0000); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 

     canvas = null; 
     //view.draw(canvas); 
     mPath = new Path(); 
     Bitmap mBitmap; 
     //Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
     mBitmap = Bitmap.createBitmap(210, 170, Bitmap.Config.ARGB_8888); 
     canvas = new Canvas(mBitmap); 
     canvas.drawColor(0xFFAAAAAA); 

     canvas.drawBitmap(mBitmap, 0, 0, mPaint); 


     //canvas.drawPaint(mPaint); 
     view.draw(canvas); 
     canvas.drawPath(mPath, mPaint); 


     mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 
             0.4f, 6, 3.5f); 



     view.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       float x = event.getX(); 
       float y = event.getY(); 
       Log.d("x", String.valueOf(x)); 
       Log.d("y", String.valueOf(y)); 

       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         Log.d("a","down"); 
         touch_start(x, y); 
         //invalidate(); 
         break; 
        case MotionEvent.ACTION_MOVE: 
         touch_move(x, y); 
         // invalidate(); 
         break; 
        case MotionEvent.ACTION_UP: 
         touch_up(); 
         // invalidate(); 
         break; 
       } 
       return true; 
      } 
     }); 

     // mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); 
    } 
    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 
    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 
    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     canvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 





} 

フリーハンフィンガーペイントを自分の視点で使用するにはどうすればよいですか?

+0

**私の回答を参照してください[http://adackoverflow.com/a/41135685/4629101] ** –

答えて

6

拡張ビューのクラスを作成し、そのビューをコンテンツビューに設定したほうが、より動的になるようにするのが最適です。タッチイベント中にAction_Moveパラメータが多く呼び出されるため、それをメモするのが最善の方法かもしれません。そうしないと、カーブが必要なときに直線が得られます。

編集
あなたは毎回Action_UPが呼び出されます、あなたは 'パス' オブジェクトのArrayListのを持っているでしょう、あなたのMYVIEWクラスの内部
View view = new MyView();
setContentView(view);

を変更することでのonCreateでオフに開始しますarrayListにパスを追加し、view.Invalidate();を使用すると、クラスはビュークラスのonDrawメソッドを呼び出します。だから、あなたはそれを上書きします。

@Override public void onDraw(Canvas c){
for(Path p: listOfPaths){
c.drawPath(p, paint);}
}

注:これは、単純な描画のために良いだろうかつて多くの行があるので、この方法では、タブレットや電話でモナリザを描くことを期待しないでくださいあなたは遅れがあるかもしれません。より複雑でプロフェッショナルになりたい場合。 view.Invalidate(Rect r)のアプローチを確認してください。これは、全体のビューを無効にするのではなく、今作成した部分だけを無効にします。

+0

ビューを拡張するすべてのクラスには、onDrawメソッドがあります。 Action_Up中にinvalidateを呼び出すだけで、onDrawメソッドが呼び出されます。更新されたビューを再描画します。これが助けてくれたらと思っています。 – dannyRods

+0

詳細情報を入手できますか?彼のコード内でこれをどうやってやりますか? –

+1

それをクリアしたホープ – dannyRods

関連する問題