다음 프로그램은 위치에 작은 구름별도의 스레드에서이 구체적인 예제를 그리는 데있어 잘못된 점은 무엇입니까?
에게 사용자의 터치를 그립니다.
/*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" />
구성과 활동은
당신은 할 수 없습니다setContentView(R.layout.activity_main);
알 수 있습니다. SurfaceView에 대한 비슷한 질문을 던졌습니다. (드로잉이 너무 길어질 때 상호 작용을 유지하십시오.) http://stackoverflow.com/q/18240420/704972. – Calaf