此绘图应用程序运行,但绘制内容时没有任何反应



这是一本旧书,有这个在屏幕上绘画的例子。因此,在键入整个程序后,它的行为并不像书中所说的那样,我将允许您在屏幕上绘制。

import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.os.Bundle;
import android.provider.Settings;
import android.provider.Settings.Panel;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class dragAndDrawActivity extends Activity
{
Paint paint;
Point point1, point2;
Path path;
List<Path> paths=new ArrayList<Path>();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(new Panel(this));
}
class Panel extends View implements View.OnTouchListener{
public Panel(Context context)
{
super(context);
paint=new Paint();
paint.setColor(Color.GREEN);
paint.setStrokeWidth(10);
paint.setStyle(Paint.Style.STROKE);
this.setOnTouchListener(this);
}
@Override
public void onDraw(Canvas canvas)
{
canvas.drawColor(Color.BLACK);
for (Path path: paths)
{
canvas.drawPath(path,paint);
}
}
@Override
public boolean onTouch(View view,MotionEvent event)
{
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
point1=new Point();
point1.x=(int) event.getX();
point1.y=(int) event.getY();
path.moveTo(point1.x, point1.y);
}
else if(event.getAction()==MotionEvent.ACTION_MOVE)
{
point2 =new Point();
point2.x=(int) event.getX();
point2.y=(int) event.getY();

path.lineTo(point2.x, point2.y);
paths.add(path);
invalidate();
}
return true;
}
}
}

构建成功并安装apk,但是当您尝试在屏幕上绘制某些内容时,没有任何反应。

并且背景颜色也不适用,因此此代码一定存在一些问题。

应将其提取到自定义视图中,并将其添加到具有对齐约束的活动布局中。此外,您需要在使用变量之前对其进行初始化path变量。

这就是我用 Kotlin 编写它的方式,你可以转换回 Java

Panel

import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import androidx.annotation.Nullable
class Panel : View, View.OnTouchListener {
var paint: Paint? = null
var point1: Point? = null
var point2:Point? = null
var path: Path = Path()
var paths: ArrayList<Path> = ArrayList()
init {
paint = Paint()
paint?.color = Color.GREEN
paint?.strokeWidth = 10f
paint?.style = Paint.Style.STROKE
this.setOnTouchListener(this)
}

constructor(context: Context): super(context)
constructor(context: Context, @Nullable attrs: AttributeSet): super(context, attrs)
override fun onDraw(canvas: Canvas) {
canvas.drawColor(Color.BLACK)
paint?.let {
for (path in paths) {
canvas.drawPath(path, it)
}
}
}
override fun onTouch(view: View, event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
point1 = Point()
point1?.x = event.x.toInt()
point1?.y = event.y.toInt()
path.moveTo((point1?.x?:0)*1f, (point1?.y?:0)*1f)
} else if (event.action == MotionEvent.ACTION_MOVE) {
point2 = Point()
point2?.x = event.x.toInt()
point2?.y = event.y.toInt()

path.lineTo((point2?.x?:0)*1f, (point2?.y?:0)*1f)
path.let {
paths.add(it)
}
invalidate()
}
return true
}
}

activity布局

<androidx.constraintlayout.widget.ConstraintLayout
android:clipToPadding="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<com.martin.screst.customviews.Panel
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Activity

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}

最新更新