Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 此绘图应用程序正在运行,但在您绘图时不会发生任何事情_Java_Android_Android Layout_Graphics - Fatal编程技术网

Java 此绘图应用程序正在运行,但在您绘图时不会发生任何事情

Java 此绘图应用程序正在运行,但在您绘图时不会发生任何事情,java,android,android-layout,graphics,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.gra

这是一本旧书,上面有一个在屏幕上画画的例子。所以在输入了整个程序之后,它的行为不像书中说的那样,我允许你在屏幕上画画

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;
        }
    }
}
导入androidx.appcompat.app.appcompat活动;
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.Path;
导入android.graphics.Point;
导入android.os.Bundle;
导入android.provider.Settings;
导入android.provider.Settings.Panel;
导入android.view.MotionEvent;
导入android.view.view;
导入java.util.ArrayList;
导入java.util.List;
公共类dragAndDrawActivity扩展活动
{
油漆;
点1,点2;
路径;
列表路径=新的ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(新面板(本));
}
类面板扩展视图实现View.OnTouchListener{
公共面板(上下文)
{
超级(上下文);
油漆=新油漆();
油漆。设置颜色(颜色。绿色);
油漆。设置行程宽度(10);
绘制.设置样式(绘制.样式.笔划);
this.setOnTouchListener(this);
}
@凌驾
公共空白onDraw(画布)
{
画布。drawColor(颜色。黑色);
用于(路径:路径)
{
画布.绘制路径(路径,绘制);
}
}
@凌驾
公共布尔onTouch(视图、运动事件)
{
if(event.getAction()==MotionEvent.ACTION\u向下)
{
点1=新点();
point1.x=(int)event.getX();
point1.y=(int)event.getY();
移动到(点1.x,点1.y);
}
else if(event.getAction()==MotionEvent.ACTION\u MOVE)
{
点2=新点();
point2.x=(int)event.getX();
point2.y=(int)event.getY();
lineTo(point2.x,point2.y);
路径。添加(路径);
使无效();
}
返回true;
}
}
}
构建成功并安装了apk,但是当您尝试在屏幕上绘制一些东西时,什么也没有发生


而且背景色也不适用,所以这段代码一定有问题

您应该将其提取到自定义视图中,并使用对齐约束将其添加到活动布局中。此外,在使用变量之前,需要初始化
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
}
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}
活动
课程

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
}
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}

该面板没有在活动中定义宽度/高度的约束。我想它的大小是0,所以你不能触摸视图。你能试试吗?另一件事,你没有初始化路径,所以它总是空的。您不能
lineTo
moveTo
路径我尝试了它,它正在工作。在使用它之前,您只需创建
Path
的实例。@RishabhDhawan非常感谢您尝试了这段代码,是的,它就是路径。现在工作很好。