简体   繁体   中英

This drawing app runs but nothing happens when you draw something

It's an old book and has this example of drawing on the screen. So after typing the whole program, it's not behaving as it was said in the books that I'll allow you to draw on the screen.

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

Build gets successful and apk install, but when you try to draw something on the screen, nothing happens.

and the background color also does not apply so there must be some issue with this code.

You should extract it to a custom view and add it to activity layout with alignment constrains. Furthermore, you need to init path variable before using it.

This is how I write it with Kotlin, you can convert back to Java

Panel class

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 layout

<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 class

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM