java - 该绘图应用程序运行,但当您绘制某些内容时没有任何反应

标签 java android android-layout graphics

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

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,但是当您尝试在屏幕上绘制某些内容时,没有任何反应。

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

最佳答案

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

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

面板

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)
}

关于java - 该绘图应用程序运行,但当您绘制某些内容时没有任何反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58460062/

相关文章:

java - Perlin 噪声不生成 1 到 -1 之间的数字

java - 为什么终端不提示再次输入此 JAVA 代码?

java - 从历史记录中清除 Activity 会卸载应用程序

java - Android布局中string.xml中的字符串格式

java - 如何在单击列表中父级的特定项目时扩展子级?

java - 如何分析 JVM 崩溃时生成的大型核心转储

java - (JUNIT/Spring 3.2) 未找到线程绑定(bind)请求 : Are you referring to request attributes outside of an actual web request

android - 如何在 recyclerview 之间放置广告

android - 将 View 粘贴到 ScrollView 的底部

java - 如何在焦点时放大 EditText?