2011-08-09 46 views
0

誰でもキャンバスを再描画する方法を教えてください。私はインターネットから多くのサンプルとソースコードを試しましたが、無効化関数func、canvas.save、canvas.restoreなどのように私のPCではまだ動作しませんでした。私はキャンバスの翻訳とスケーリングをしたいのですが、私は何も表示されていないインターネット上の手順に従います。これは私のソースコードです。 (まだJava/Androidプログラミングの新機能です)Androidのキャンバスを再描画する方法

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    drawMaps.j=1; 
    resources = this.getResources(); 
    try { 
     GetAttributes("path"); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar1); 
     panel = new Panel(this); 
     setContentView(R.layout.main); 
     panel.onDraw(canvas2); 
     ImageView image = (ImageView) findViewById(R.id.mapImage); 
      image.setImageBitmap(bufMaps); 
} 


class Panel extends View{ 
    Paint paint = new Paint(); 
    public Panel(Context context) { 
     super(context); 
     setFocusable(true); 
    } 


    public Bitmap quicky_XY(Bitmap bitmap,int pos_x,int pos_y){ 
     Bitmap bufMap = Bitmap.createBitmap(bitmap.getWidth(), 
     bitmap.getHeight(), Config.ARGB_8888); 
     Canvas canvas = new Canvas(bufMap); 
     canvas.save(); 
      final Paint paint = new Paint(); 
      width = canvas.getWidth();//start 
      height = canvas.getHeight();//end 
      drawMaps.xpos = width/30; 
      drawMaps.ypos = height/ 20; 

      paint.setStrokeWidth(0); 
      for (int i = 0; i < 30; i++) { 
       paint.setColor(Color.DKGRAY); 
       canvas.drawLine(drawMaps.xpos +(drawMaps.xpos*i), 0, 
        drawMaps.xpos +(drawMaps.xpos*i), height, paint); 
      //canvas.drawLine(startX, startY, stopX, stopY, paint) 
      } 
      for (int i = 0; i < 20; i++) { 
       paint.setColor(Color.DKGRAY); 
       canvas.drawLine(0, drawMaps.ypos+(drawMaps.ypos*i), 
        width, drawMaps.ypos+(drawMaps.ypos*i), paint); 
      } 

      canvas.translate(pos_x,pos_y); 
      drawMaps.addPath(canvas); 
      canvas.restore(); 
      invalidate(); 
     return bufMap; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.save(); 
     bufMaps = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
     bufMaps = quicky_XY(emptyBmap,positionX,positionY); 

    } 

} 

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
positionX = (int)event.getRawX(); 
positionY = (int)event.getRawY(); 
switch(event.getAction()) 
     { 
     case MotionEvent.ACTION_DOWN: { 
      prevX = positionX; 
      prevY = positionY; 
     } 
     break; 
     case MotionEvent.ACTION_MOVE: { 
      final int distY = Math.abs(positionY - prevY); 
      final int distX = Math.abs(positionX - prevX);  
      if (distX > mTouchSlop || distY > mTouchSlop){ 
       panel.getDrawingCache(); 
       panel.invalidate(); 
      } 
       Log.e("LSDEBUG", "touch X, " + positionX); 
     }  
     break; 
     } 
return true; 
} 

答えて

1

あなたは自分でonDraw()を呼び出さないでください。代わりにinvalidate()を呼び出すと、できるだけ早くonDraw()が呼び出されます。

また、onDraw()メソッドの外側からキャンバスに描画しようとする場合は、キャンバスへの参照を取得する必要があります。

あなたのonDraw()の内部でキャンバスは変更されていません。のみ保存された(再び、(無効に呼ばれる)、またはシステムがこのビューを再描画する必要があるとき):

onDraw(外部からキャンバスへのアクセス
@Override 
public void onDraw(Canvas canvas) { 
    canvas.save(); 
    bufMaps = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
    bufMaps = quicky_XY(emptyBmap,positionX,positionY); 

} 

))(ホルダーを使用して行われlockCanvas()を取得します。キャンバスへの参照。描画した後、unlockAndPost()を使用して再度ロックを解除します。

サーフェスがいつ使用できるかを調べるには、Callback.surfaceCreatedインターフェイスも実装する必要があります。

android reference for SurfaceHolderをご覧ください。

This post explains it

関連する問題