次のプログラムは小さな雲を描画します
ユーザーが触れる場所。
に置き換える/*A*/
と正常///*A*/
に動作します。
しかし、それは鈍いです。したがって、( をコメントアウトせずに/*A*/s
) 描画は別のスレッドで行われます。円滑な対話を維持するために、ユーザーがポインタを移動するとスレッドが中断されます。
別のスレッドで適切に描画するには、このコードをどのように変更しますか?
public class MyView extends View {
/*A*/ protected MyDrawThread myDrawThread;
protected float x, y;
protected Paint paint = new Paint();
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setAntiAlias(true);
/*A*/ myDrawThread = new MyDrawThread();
}
@Override protected void onDraw(Canvas canvas)
{
/*A*/ if( myDrawThread.isAlive() )
/*A*/ myDrawThread.interrupt();
/*A*/
/*A*/ myDrawThread.setCanvas( canvas );
/*A*/ myDrawThread.start();
/*A*/ }
/*A*/
/*A*/ class MyDrawThread extends Thread {
/*A*/ private Canvas canvas;
/*A*/
/*A*/ public MyDrawThread() {
/*A*/ super();
/*A*/ }
/*A*/ public void setCanvas( Canvas cnvs ) {
/*A*/ canvas = cnvs;
/*A*/ }
/*A*/ public void run()
/*A*/ {
for(int i=0;i<10000;++i) {
double angle = (double) (Math.random() * 2.0 * Math.PI);
float distance = (float) (Math.random() * getWidth()/25.0f);
float dx = (float) (distance*Math.cos(angle));
float dy = (float) (distance*Math.sin(angle));
canvas.drawCircle(x+dx, y+dy, 0.1f, paint);
}
/*A*/ }
}
@Override public boolean onTouchEvent(MotionEvent event) {
x = event.getX();
y = event.getY();
invalidate();
return true;
}
}
レイアウトactivity_main
は
<.MyView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
アクティビティは View through を設定します
setContentView(R.layout.activity_main);