วาดเส้นหลายเส้นและจดจำความหนา

อาจเป็นเพราะฉันมีวันอันยาวนานและมันค่อนข้างดึกแล้ว แต่ดูเหมือนฉันคิดไม่ออกว่าฉันทำอะไรผิด

ฉันแค่ต้องการที่จะวาดเส้นที่ตำแหน่งนิ้วของฉันโดยแต่ละบรรทัดเพื่อให้มีความกว้าง / สีที่แตกต่างกัน ฯลฯ

เมื่อใดก็ตามที่ 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);
    }
}

ขอบคุณล่วงหน้า!


person James    schedule 08.05.2013    source แหล่งที่มา


คำตอบ (1)


ในบรรทัดเหล่านี้:

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

“เพ้นท์” ส่งอะไรมา??? ไม่ใช่ตัวชี้ไปยังโครงสร้างที่เต็มไปด้วยค่าที่ตั้งไว้ล่วงหน้าหรือไม่ pathMap.put ทุกอันไม่ได้ส่งพอยน์เตอร์ตัวเดียวกันซึ่งชี้ไปยังข้อมูลเดียวกันใช่หรือไม่ นั่นคือเหตุผลว่าทำไมถ้าคุณเปลี่ยนครั้งเดียว คุณจะเปลี่ยนทุกที่

คุณต้องสร้าง Paint ใหม่สำหรับแต่ละ pathMap.put ที่คุณสร้างและคัดลอกค่าปัจจุบันของ 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;
person HalR    schedule 09.05.2013
comment
ขอบคุณมากสำหรับสิ่งนี้ - ฉันใช้เวลาหลายปีในการพยายามหาวิธีเปลี่ยนความกว้างของวัตถุ Paint - person David Christopher Reynolds; 29.10.2014