gpt4 book ai didi

android - 清除 Canvas 区域

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:17 26 4
gpt4 key购买 nike

我制作了一个从 xml 布局引用的自定义 View 。我添加了一个用于清除 View 的按钮。现在我想在单击时清除 Canvas 区域。我在 xml 布局文件中添加了一个 onClick 事件。现在我应该在哪里添加用于清除整个 View / Canvas 的代码?我刚刚添加了几部分代码。 (这没有清除任何东西)。我已经按如下顺序添加了我的 Activity 、 View 和布局文件。

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>

最佳答案

您需要做的是在 onDraw 方法中访问 Canvas 。

因此,如果您使用全局变量,请在您的按钮单击方法中将其设置为 true。在 OnDraw 中,您可以检查其状态并在必要时清除 Canvas 。 (然后将其设置回 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();
}

}

编辑:查看您的新代码,我发现了一些问题。

我认为它围绕着您没有清除正确 View 这一事实展开。

首先,获取现有 View 的实例。然后你可以清除它。而不是错误的不存在的实例。

 CustomView cv = (CustomView)findViewById(R.id.customView); 
cv.clearCanvas();

尝试 invalidate(); else postInvalidate(); 应该可以。

postInvalidate() 适用于在非 UI 线程上运行的情况。

关于android - 清除 Canvas 区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com