简体   繁体   English

如何在 Android 中更改 canvas 上的油漆颜色/厚度?

[英]How do I change the color/thickness of my paint on a canvas in Android?

I'm not able to change the color or thickness of my paint when I click an imageButton, even though I programmed it too.当我点击一个图像按钮时,我无法改变我绘画的颜色或厚度,即使我也对它进行了编程。 I know I'm doing something wrong and I think I know why but I can't fix it.我知道我做错了什么,我想我知道为什么,但我无法解决。 I feel like I'm not calling the right paintbrush.我觉得我没有调用正确的画笔。 Here's my Java Class code:这是我的 Java Class 代码:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class CanvasView extends View
{
private Paint paint = new Paint();
private Path path = new Path();
private Canvas canvas = new Canvas();
private Paint canvasPaint = new Paint();
private Bitmap canvasBitmap;

public CanvasView(Context context, AttributeSet attrs)
{
    super(context, attrs);

    paint.setAntiAlias(true);
    paint.setStrokeWidth(5);
    paint.setColor(Color.BLACK);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
    super.onSizeChanged(w, h, oldw, oldh);
    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    canvas = new Canvas(canvasBitmap);
}

@Override
protected void onDraw(Canvas drawCanvas)
{
    drawCanvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    drawCanvas.drawPath(path, paint);
}

@Override
public boolean onTouchEvent(MotionEvent e)
{
    // get the coords of the touch event
    float eventX = e.getX();
    float eventY = e.getY();

    switch (e.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // set a new starting point
            path.moveTo(eventX, eventY);
            return true;
        case MotionEvent.ACTION_MOVE:
            // connect the points
            path.lineTo(eventX, eventY);
            break;
        default:
            return false;
    }

    //makes you view repaint and call ondraw
    invalidate();
    return true;
}

public void clearCanvas()
{
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
}

Here's my MainActivity code:这是我的 MainActivity 代码:

public class MainActivity extends Activity {

private CanvasView canvasView;
private Paint paint;
private int orange;
private int purple;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    canvasView = (CanvasView) findViewById(R.id.canvasView);
    paint = new Paint();
    orange = Color.rgb(255, 245, 238);
    purple = Color.rgb(128, 0, 128);

    // REGULAR BUTTONS: save, about, reset
    Button saveB = (Button) findViewById(R.id.saveButton);
    Button aboutB = (Button) findViewById(R.id.aboutButton);
    Button resetB = (Button) findViewById(R.id.resetButton);

    // IMAGE BUTTONS: red, blue, green, yellow, black, purple, orange, erase, brush thickness plus, brush thickness minus
    ImageButton redIb = (ImageButton) findViewById(R.id.redButton);
    ImageButton blueIb = (ImageButton) findViewById(R.id.blueButton);
    ImageButton greenIb = (ImageButton) findViewById(R.id.greenButton);
    ImageButton yellowIb = (ImageButton) findViewById(R.id.yellowButton);
    ImageButton blackIb = (ImageButton) findViewById(R.id.blackButton);
    ImageButton purpleIb = (ImageButton) findViewById(R.id.purpleButton);
    ImageButton orangeIb = (ImageButton) findViewById(R.id.orangeButton);
    ImageButton eraseIb = (ImageButton) findViewById(R.id.eraseButton);
    ImageButton plusIb = (ImageButton) findViewById(R.id.plusButton);
    ImageButton minusIb = (ImageButton) findViewById(R.id.minusButton);

    minusIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setStrokeWidth(-5);
        }
    });

    plusIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setStrokeWidth(5);
        }
    });

    eraseIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setColor(Color.TRANSPARENT);
        }
    });

    orangeIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setColor(orange);
        }
    });

    purpleIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setColor(purple);
        }
    });

    blackIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setColor(Color.BLACK);
        }
    });

    yellowIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setColor(Color.YELLOW);
        }
    });

    greenIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setColor(Color.GREEN);
        }
    });

    blueIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setColor(Color.BLUE);
        }
    });

    redIb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paint.setColor(Color.RED);
        }
    });

    saveB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

    aboutB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), AboutActivity.class);

            startActivity(intent);
        }
    });

    resetB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            canvasView.clearCanvas();
            // canvasView.clearCanvas2();
        }
    });
}

You are setting your values on a entire different Paint which has no connection to your CanvasView.您正在一个完全不同的 Paint 上设置您的值,该 Paint 与您的 CanvasView 没有任何联系。 You would have to change the Paint of your CanvasView and call invalidate on it to make any changes.您必须更改 CanvasView 的 Paint 并对其调用 invalidate 以进行任何更改。

Implement something like this in your CanvasView to change the stroke width:在 CanvasView 中实现类似的东西来改变笔画宽度:

public void setStrokeWidth(int strokeWidth) {
    paint.setStrokeWidth(strokeWidth);
    invalidate();
}

and call it in your onClick() with canvasView.setStrokeWidth(5);并在您的onClick()使用canvasView.setStrokeWidth(5);调用它canvasView.setStrokeWidth(5);

Same goes for Color:颜色也一样:

public void setColor(int color) {
    paint.setColor(color);
    invalidate();
}

and call it in your onClick() with canvasView.setColor(Color.BLUE);并在您的onClick()使用canvasView.setColor(Color.BLUE);调用它canvasView.setColor(Color.BLUE);

如果你想在 Kotlin 中实现;

paint.strokeWidth = 3.0f

You have created a Paint object in your activity (let's say paint1) and you have another Paint object in your canvas class (let's say paint2).您已经在您的活动中创建了一个 Paint object(假设是 paint1)并且您在 canvas class(假设是 paint2)中有另一个 Paint object。 You're performing the drawing operation using paint2 but in your activity, you're not updating the paint2 instead you're changing the paint1 that is created within the activity.您正在使用 paint2 执行绘图操作,但在您的活动中,您没有更新 paint2,而是更改了在活动中创建的 paint1。 So your changes upon button clicks are not shown.因此,您在单击按钮时所做的更改不会显示。

You need to pass the paint1 object from activity to canvas in order to make changes and also call the invalidate() to redraw with updated paint.您需要将 paint1 object 从活动传递到 canvas 以便进行更改,还需要调用 invalidate() 以使用更新的油漆重绘。 See the code below:请参阅下面的代码:

public void updateCanvasPaint(Paint paint){
    this.paint = paint;
    invalidate();
}

Call this in your onClick methods after making changes to paint.在对绘画进行更改后,在您的 onClick 方法中调用它。 Like this:像这样:

blueIb.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        paint.setColor(Color.BLUE);
        canvasView.updateCanvasPaint(paint);
    }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 每次尝试更改绘画的属性(厚度或颜色)时,它都会更改Canvas(android)(java)上已有的绘画 - Every time I try to change a property of my paint (thickness or color), it changes existing paint that's already on the Canvas (android) (java) 如何在Android的画布上更改特定的rect颜色? - how do i change specific rect color on a canvas in android? 如何更改我的 Android 应用程序列的背景颜色 - How do I change the background color for a column of my Android app 如何更改 Android 应用程序中时间选择器的颜色? - How do I change the color of the timepicker in my Android app? 你如何在 Android 中将油漆颜色设置为橙色? - How do you set the paint color to orange in Android? 如何根据用户输入更改android应用的背景颜色? - How do I change the background color of my android app based on user input? 如何更改我的按钮颜色,使用 android:background 给它白色边框? - How do I change my Buttons color, using android:background gives it white borders? 如何在Android的画布上绘制小矩形? - How paint small rectangels on a canvas on Android? Android canvas.drawText使用油漆显示不良颜色 - Android canvas.drawText using paint display bad color 如何更改计时器内的颜色 - How to change the Color of paint inside a timer
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM