我制作了一个自定义视图,该视图来自xml布局。我添加了一个清除视图的按钮。现在我想在点击时清除画布区域。我在xml布局文件中添加了一个onClick事件。现在我如何在哪里添加清除整个视图/画布的代码?我刚刚添加了一小部分代码。 (这不是清除任何东西)。我按顺序添加了我的活动,视图和布局文件。
public class CustomViewActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void clearLine(View v) {
new CustomView(CustomViewActivity.this, null).clearCanvas();
}
}
public class CustomView extends View {
private Paint paint = new Paint();
private Path path = new Path();
public Boolean clearCanvas = false;
public CustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomView(Context context,AttributeSet attrs ) {
super(context,attrs);
paint.setAntiAlias(true);
paint.setColor(Color.BLUE);
paint.setTextSize(20);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(5f);
}
protected void onDraw(Canvas canvas) {
if(clearCanvas)
{ // Choose the colour you want to clear with.
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
//canvas.drawColor(0, Mode.CLEAR);
clearCanvas = false;
}
super.onDraw(canvas);
canvas.drawText("Hello World", 5, 30, paint);
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//int action = event.getAction() & MotionEvent.ACTION_MASK;
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
break;
case MotionEvent.ACTION_UP:
// nothing to do
break;
default:
return false;
}
// Schedules a repaint.
invalidate();
return true;
}
public void clearCanvas(){
clearCanvas = true;
postInvalidate();
//canvas.drawColor(0, Mode.CLEAR);
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.CustomViewEvent.CustomView
android:id="@+id/customView"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="28dp"
android:onClick="clearLine"
android:text="CLEAR" />
</RelativeLayout>
答案 0 :(得分:5)
您需要做的是在onDraw方法中访问画布。
因此,如果您使用全局变量,请在按钮单击方法中将其设置为true。在OnDraw中,您可以检查其状态并在必要时清除画布。 (然后将其设置为false,这样每次都不会这样做。)
请参阅以下代码了解用法。
public Boolean clearCanvas = false;
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(clearCanvas)
{ // Choose the colour you want to clear with.
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
clearCanvas = false;
}
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
break;
case MotionEvent.ACTION_UP:
// nothing to do
break;
default:
return false;
}
// Schedules a repaint.
invalidate();
return true;
}
// this is the method which will be invoked from main activity class for clearing whatever //is in the view/canvas
public void clearCanvas(){
//canvas.drawColor(0, Mode.CLEAR);
clearCanvas = true;
invalidate();
}
}
修改强> 看看你的新代码我发现了一些问题。
我认为它不会清除你没有清除正确视图的事实。
首先,获取现有视图的实例。然后你可以清除它。而不是错误的非现有实例。
CustomView cv = (CustomView)findViewById(R.id.customView);
cv.clearCanvas();
尝试invalidate();
其他postInvalidate();
一个人应该工作。
postInvalidate()
用于在非UI线程上运行时。