Menggambar banyak garis dan mengingat ketebalannya

Mungkin karena aku menjalani hari yang melelahkan dan hari sudah cukup larut, tapi sepertinya aku tidak tahu apa kesalahanku.

Saya hanya ingin dapat menggambar garis pada posisi jari saya dengan setiap garis memiliki lebar/warna yang berbeda, dll.

Setiap kali ACTION_DOWN dipecat, saya membuat Path baru dan terus menambahkannya di ACTION_MOVE. Ketika ACTION_UP dipecat, saya memasukkan Path dan Paint saat ini ke dalam HashMap saya, sehingga menghemat Path mana yang menggunakan Paint yang mana, bukan?

Ketika saya memanggil setRadius(float radius) dari luar kelas ini saya memanggil paint.setStrokeWidth(radius), sehingga mengubah lebar goresan Paint saat ini.

Tetapi untuk beberapa alasan setiap kali saya memanggil setStrokeWidth(radius) SEMUA dari Map.Entry saya berubah?? Dan dengan demikian menghasilkan lebar guratan Setiap Paint menjadi lebar guratan 'baru' dan mengecat ulang semuanya dengan lebar guratan baru.

Ini mungkin sangat jelas tetapi sepertinya saya tidak dapat menemukan kesalahannya.

Ini adalah DrawView.java saya.

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

Terima kasih sebelumnya!


person James    schedule 08.05.2013    source sumber


Jawaban (1)


Di baris ini:

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

Apa yang Anda kirimkan dalam "cat"??? Bukankah itu penunjuk ke struktur yang diisi dengan nilai preset. Bukankah setiap pathMap.put mengirimkan pointer yang sama yang menunjuk ke data yang sama? Itu sebabnya jika Anda mengubahnya sekali, Anda mengubahnya di mana saja.

Anda perlu membuat Paint baru untuk setiap pathMap.put yang Anda buat dan menyalin nilai paint kelas Anda saat ini ke dalamnya.

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
Terima kasih banyak untuk ini - Saya telah menghabiskan waktu lama mencoba mencari cara untuk mengubah lebar objek Paint. - person David Christopher Reynolds; 29.10.2014