Tôi đang thử nghiệm bằng cách vẽ trên canvas bằng cách sử dụng một chuỗi để tạo một công cụ trò chơi đơn giản nhưng tôi đang gặp một số vấn đề lạ mà tôi không thể giải thích. Mục đích của "trò chơi" này là vẽ một vòng tròn mỗi giây trên canvas. Điều này hoạt động, nhưng không phải cách tôi muốn nó hoạt động, có vẻ như ứng dụng đang chuyển đổi giữa hai khung hình và thêm vòng tròn vào mỗi khung hình để bạn có thể chuyển đổi giữa hai khung hình mỗi giây với cùng số vòng kết nối. đặt trên canvas.Bản vẽ canvas SurfaceView của Android với một chủ đề
Tôi không biết mình đang làm gì sai, nhưng tôi không quen với Treadding, có liên quan gì đến số lõi mà thiết bị Android của tôi có hoặc thứ gì đó như thế không?
Mã của tôi được hiển thị bên dưới, vì vậy tôi chỉ sử dụng một bản phát hành sử dụng tệp sơ đồ bố trí liên kết đến animationthread bắt đầu chuỗi và vẽ vòng tròn trên canvas mỗi giây. (Bạn có thể bỏ qua phần cảm ứng, nó chưa được sử dụng). dự án
Các tồn tại ra khỏi một launchthread chính:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
trong đó sử dụng tập tin này bố trí:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.androidtesting.AnimationView
android:id="@+id/aview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
Và lớp Surfaceview của tôi với một bên trong lớp Thread:
class AnimationView extends SurfaceView implements SurfaceHolder.Callback {
private boolean touched = false;
private float touched_x, touched_y = 0;
private Paint paint;
private Canvas c;
private Random random;
private AnimationThread thread;
public AnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
thread = new AnimationThread(holder);
}
class AnimationThread extends Thread {
private boolean mRun;
private SurfaceHolder mSurfaceHolder;
public AnimationThread(SurfaceHolder surfaceHolder) {
mSurfaceHolder = surfaceHolder;
paint = new Paint();
paint.setARGB(255,255,255,255);
paint.setTextSize(32);
}
@Override
public void run() {
while (mRun) {
c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
doDraw(c);
sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
private void doDraw(Canvas canvas) {
//clear the canvas
//canvas.drawColor(Color.BLACK);
random = new Random();
int w = canvas.getWidth();
int h = canvas.getHeight();
int x = random.nextInt(w-50);
int y = random.nextInt(h-50);
int r = random.nextInt(255);
int g = random.nextInt(255);
int b = random.nextInt(255);
int size = 20;
canvas.drawCircle(x,y,size,paint);
canvas.restore();
}
public void setRunning(boolean b) {
mRun = b;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
touched_x = event.getX();
touched_y = event.getY();
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
touched = true;
break;
case MotionEvent.ACTION_MOVE:
touched = true;
break;
default:
touched = false;
break;
}
return true;
}
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
thread.setRunning(false);
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
}
Đó có phải là AnimationView2 trong mã của bạn không? Một phiên bản sửa chữa sẽ được đánh giá cao. – RichieHH
(ps khi bạn sao chép mã từ một ví dụ mẫu (đây là một LunarLander được sửa đổi nhẹ) luôn luôn tốt nhất của nó để nhà nước nó vì nó làm cho săn lỗi dễ dàng hơn)). – RichieHH