อาจเป็นเพราะฉันมีวันอันยาวนานและมันค่อนข้างดึกแล้ว แต่ดูเหมือนฉันคิดไม่ออกว่าฉันทำอะไรผิด
ฉันแค่ต้องการที่จะวาดเส้นที่ตำแหน่งนิ้วของฉันโดยแต่ละบรรทัดเพื่อให้มีความกว้าง / สีที่แตกต่างกัน ฯลฯ
เมื่อใดก็ตามที่ ACTION_DOWN ถูกไล่ออก ฉันจะสร้าง Path
ใหม่ และต่อท้ายที่ ACTION_MOVE เมื่อ ACTION_UP ถูกไล่ออก ฉันจะใส่ Path
และ Paint
ปัจจุบันใน HashMap
ของฉัน ดังนั้นจะบันทึกว่า Path
ตัวไหนใช้ Paint
อันไหน ใช่ไหม
เมื่อฉันโทร setRadius(float radius)
จากนอกคลาสนี้ ฉันจะโทร paint.setStrokeWidth(radius)
ดังนั้นการเปลี่ยนความกว้างเส้นขีดของ Paint
ปัจจุบัน
แต่ด้วยเหตุผลบางอย่างทุกครั้งที่ฉันเรียกแผนที่ของฉัน setStrokeWidth(radius)
ทั้งหมด รายการมีการเปลี่ยนแปลง?? และส่งผลให้ความกว้างของเส้นขีดของ ทุก Paint
เป็นความกว้างของเส้นขีด 'ใหม่' และทาสีทุกอย่างใหม่ด้วยความกว้างของเส้นขีดใหม่
มันอาจจะชัดเจนมาก แต่ฉันก็ไม่พบข้อผิดพลาด
นี่คือ 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);
}
}
ขอบคุณล่วงหน้า!