2012-02-19 13 views
2

最初は私のプログラムの開発は、次のようになります。invalidate()を無効にするにはどうすればよいですか?

enter image description here

しかし、私は、画面プログラムの開発を中心に画像を移動していますになります:

enter image description here

赤いグラフはonDrawでランダムに生成されます方法。だから私は周りの写真をドレッジし、静止画の背景を持っていないinavalidates私は動画を見ながら。ここ

は私のコードです: カスタムビュー: パッケージcom.graph.base。

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.util.AttributeSet; 
import android.view.View; 
import java.util.Random; 

public class CustomView extends View 
{ 
Random random=new Random(); 
public CustomView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public CustomView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomView(Context context) { 
    super(context); 
} 
public void onDraw (Canvas canvas) 
{ 
    super.onDraw(canvas); 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    paint.setStyle(Paint.Style.FILL); 
    paint.setColor(Color.WHITE); 
    canvas.drawPaint(paint); 
    Path path=new Path(); 
    path.moveTo(10, 10); 
    for (float i=0.5f; i<=140; i+=10) 
    { 
     path.quadTo(10+i*5, 10+random.nextInt(500), 10+(i+10)*5,  10+random.nextInt(500)); 
    } 
    paint.setDither(true); 
    paint.setColor(Color.RED); 
    paint.setStyle(Paint.Style.STROKE);  
    paint.setStrokeJoin(Paint.Join.ROUND); 
    paint.setStrokeCap(Paint.Cap.ROUND); 
    paint.setStrokeWidth(2); 
    canvas.drawPath(path, paint); 
} 

}

MainActivity

package com.graph.base; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 

public class MainActivity extends Activity { 
FrameLayout frame; 
ImageView image; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    frame=(FrameLayout)findViewById(R.id.frameLayout1); 
    image=(ImageView)findViewById(R.id.imageView1); 
    image.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent event) { 
      Log.e("TAG", "Touch happend"); 
      switch (event.getAction()) 
      { 
      case MotionEvent.ACTION_MOVE: 
      { 
       image.setPadding((int)event.getX(),  (int)event.getY(), 0, 0); 
       break; 
      } 

      } 

      return true; 
     } 
    }); 
} 

public void invalidateButton_Click (View v) 
{ 
    frame.invalidate(); 
} 
} 

答えて

0

あなたのキャンバスにランダムな線を描画しています。このコードは、画面が無効になるたびに呼び出されます。描画を変更しないようにするには、ビットマップをキャンバスに設定し、ビットマップに描画します。 onDraw()メソッドで、ビットマップをキャンバスに描画します。 onDrawで

// Outside of onDraw() 
Bitmap bmDest = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
Canvas mycanvas = new Canvas(bmDest); 
// Do your drawing on the canvas outside of the onDraw() method 

()、あなたは、単にこのやる:

canvas.drawBitmap(bmDest, x, y, null); 
+0

ここには投稿できませんが、私のすべてのonDrawメソッドをmy customViewのコンストラクタに書き直そうとするとエラーが発生します。私は私のビューを作成するとき、私はグラフを生成し、それをビットマップキャンバスに配置して描画すると思いますが、IVEは多くのエラーを持っています。 –

+0

ここに私のコードです:[リンク](http://pastebin.com/D6CaHWVP) –

+0

あなたのコードのクイックビューは、drawBitmap()を除いて大丈夫です。 2つの数字は、幅/高さではなく、左上隅のx/yです。あなたは私にエラーが何であるかを見せていないので、私はコメントすることはできません。あなたは本当にあなたが望むように動作するように描画/描画ロジックを適切に設計する必要があります。 – BitBank

0

実は、あなたが "無効無効化" ではないはずですが、実際には "無効" と呼んでやるの...

case MotionEvent.ACTION_MOVE: 
     { 
      image.setPadding((int)event.getX(),  (int)event.getY(), 0, 0); 
      // here call frame.invalidate(Rect dirty), with dirty set to where the image was previously 
      break; 
     } 

カスタムビューは、「ランダム」描くならば、あなたはキャッシュされたバージョンでビットマップを取得し、描画できることに注意してください(blitコピー)

関連する問題