/ / Invalidate не се обажда наDraw - Android, Android-платно

Невалидна не се обажда наDraw - Android, Android-платно

трябва да кликне върху бутона преначертаване на картината, но след метод invalidate onDraw метод не се нарича. Но обаждането на Draw става само след стартиране на приложението.

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Draw draw = new Draw(this);

Button button = (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
draw.setA(40);
draw.setB(300);
draw.invalidate();
}
});

}
}

Ето кода Draw.java

public class Draw extends View {

private Paint mPaint;
private int a;
private int b;

public Draw(Context context) {
super(context);
init();
}

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

public Draw(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}

private void init() {
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(5);
setWillNotDraw(false);
a = 0;
b = 0;
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.WHITE);
canvas.drawPaint(mPaint);

mPaint.setColor(Color.BLACK);
mPaint.setAntiAlias(true);
canvas.drawLine(80, 50, 80, 500, mPaint);
canvas.drawLine(80, 50, 70, 85, mPaint);
canvas.drawLine(80, 50, 90, 85, mPaint);

canvas.drawLine(80, 500, 500, 500, mPaint);
canvas.drawLine(500, 500, 465, 510, mPaint);
canvas.drawLine(500, 500, 465, 490, mPaint);

mPaint.setTextSize(35);
mPaint.setStrokeWidth(2);
canvas.drawText("X", 480, 540, mPaint);
canvas.drawText("Y", 45, 80, mPaint);
canvas.drawText("0", 70, 540, mPaint);

drawFunction(canvas, a, b);
}

public void drawFunction(Canvas canvas, int a, int b) {

mPaint.setColor(Color.BLACK);
mPaint.setAntiAlias(true);
canvas.drawLine(80, 500, a, b, mPaint);
}

public void setA(int a) {
this.a = a;
}

public void setB(int b) {

this.b = b;
}
}

main.xml

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<labs.example.function.Draw
android:layout_width="match_parent"
android:layout_height="wrap_content">

</labs.example.function.Draw>
</RelativeLayout>

Благодаря предварително.

Отговори:

3 за отговор № 1

Добавете идентификатор

<labs.example.function.Draw
android:id="@id/draw"
android:layout_width="match_parent"
android:layout_height="wrap_content">

</labs.example.function.Draw>

Заменете

 final Draw draw = new Draw(this);

от

 final Draw draw = (Draw) findViewById(R.id.draw); // need to refer to the view in xml.

Ако използвате final Draw draw = new Draw(this); трябва да добавите този изглед към визуалната си йерархия.


0 за отговор № 2

Опитали ли сте да се обадите? setWillNotDraw(false), В това пост можете да видите, че по подразбиране всички подгрупи от ViewGroup не се обаждат на тях onDraw метод.