gpt4 book ai didi

android - 绘制多条线并记住它们的粗细

转载 作者:行者123 更新时间:2023-11-29 18:00:30 38 4
gpt4 key购买 nike

可能是因为我度过了漫长的一天,而且已经很晚了,但我似乎无法弄清楚自己做错了什么。

我只想能够在我手指的位置画线,每条线都有不同的宽度/颜色等。

每当 ACTION_DOWN 被触发时,我都会创建一个新的 Path 并将其附加到 ACTION_MOVE。当 ACTION_UP 被触发时,我将当前的 PathPaint 放在我的 HashMap 中,从而保存哪个 Path 使用了哪个 Paint,对吧?

当我从此类外部调用 setRadius(float radius) 时,我调用了 paint.setStrokeWidth(radius),从而改变了当前的 Paint的笔画宽度。

但出于某种原因,每次我调用 setStrokeWidth(radius) ALL 时,我的 Map.Entry 的更改?从而导致 Every Paint 的 stroke-width 成为“新的”stroke-width,并使用新的 stroke-width 重新绘制所有内容。

这可能非常明显,但我似乎找不到错误。

这是我的 DrawView.java。

package com.example.paintandprint;

import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class DrawView extends View implements OnTouchListener {
Path path = new Path();
Paint paint = new Paint();

Map<Path, Paint> pathMap = new HashMap<Path, Paint>();

public DrawView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);

this.setOnTouchListener(this);

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

@Override
public void onDraw(Canvas canvas) {
canvas.drawPath(path, paint);

for (Map.Entry<Path, Paint> p : pathMap.entrySet()) {
canvas.drawPath(p.getKey(), p.getValue());
}

}

public boolean onTouch(View view, MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path = new Path();
path.reset();
path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
break;
case MotionEvent.ACTION_UP:
pathMap.put(path, paint);
break;
default:
return false;
}

invalidate();
return true;
}

public float getRadius() {
return paint.getStrokeWidth();
}

public void setRadius(float radius) {
paint.setStrokeWidth(radius);
}
}

提前致谢!

最佳答案

在这些行中:

case MotionEvent.ACTION_UP:
pathMap.put(path, paint);
break;

你在“paint”中发送什么???是不是指向一个结构体的指针,里面填充了预设值。不是每个 pathMap.put 发送指向相同数据的相同指针吗?这就是为什么只要更改一次,就会到处更改。

您需要为您创建的每个 pathMap.put 创建一个新的 Paint,并将您类的 paint 的当前值复制到它。

case MotionEvent.ACTION_UP:
Paint newPaint = new Paint();
newPaint.set(paint); //copies the values over from the current class's paint
pathMap.put(path, newPaint);
break;

关于android - 绘制多条线并记住它们的粗细,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451848/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com