کرش در Thread و Canvas
سلام دوستان. وقتی کد زیر رو اجرا میکنه برنامه کرش میکنه. دلیلش رو اصلا نمیدونم اما میدونم که از خط کشیدن Arc کرش میکنه. چون اگر اون رو بردارم یا خارج از هندلر و Thread بنویسم کرش نمیکنه. اما چون میخوام انیمشن دادن رو تمرین کنم میخوام عمل کنه. متشکر
package test1.com.hadi.canvastest;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class CanvasView extends ImageView {
public Paint fillPaint;
int in = 0;
public CanvasView(Context context) {
super(context);
init();
}
public CanvasView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public CanvasView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void init() {
fillPaint = new Paint();
fillPaint.setColor(Color.parseColor("#000fff"));
fillPaint.setStyle(Paint.Style.FILL);
fillPaint.setStrokeWidth(5);
}
@Override
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
int centerX = getWidth() / 2;
int centerY = getHeight() / 2;
int radius = 300;
final RectF rect = new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i <= 90; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
MainActivity.handler.post(new Runnable() {
@Override
public void run() {
in += 1;
canvas.drawArc(rect, 0, in, false, fillPaint);
}
});
}
}
});
thread.start();
}
}
سلام ، در متد onDraw نیازی به استفاده از thread نیست ، و اصلا اشتباهه استفاده از thread در onDraw . چون onDraw هر موقع به طور کامل اجرا بشه چیزی رسم میکنه ، نه از طریق یک thread . وقتی شما در اولین اجرای پیش فرض onDraw ، به دستور thread.start() میرسی ، دیگه متد onDraw تموم شده و چیزی رسم نشده . حالا اینکه یک thread تعریف شده که یه چیزی رسم کنه ، کار نمیکنه ، چون ترسیم باید از طریق متد onDraw انجام بشه . که کار متد invalidate همینه ، که کل متد onDraw رو دوباره صدا میزنه . متد onDraw رو به این صورت تغییر بده :
@Override
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
int centerX = getWidth() / 2;
int centerY = getHeight() / 2;
int radius = 50;
final RectF rect = new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
try {
Thread.sleep(1000);
canvas.drawArc(rect, 0, in, false, fillPaint);
in += 1;
invalidate();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
در ضمن برای کارایی بهتر ، خوبه که centerX و centerY و radius و rect رو فیلد کنی و در متد init مقدار بدی .
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .