2013-10-17 74 views
0

我有一个问题。当我用双击进行绘画时更改笔画宽度时,笔画宽度已经绘画也发生变化。我想要改变笔画宽度而不改变最后的笔画。如何更改笔画宽度android?

这里我的代码:

package com.example.paint; 

    import android.content.Context; 
    import android.graphics.Canvas; 
    import android.graphics.Color; 
    import android.graphics.Paint; 
    import android.graphics.Path; 
    import android.support.v4.view.GestureDetectorCompat; 
    import android.util.AttributeSet; 
    import android.util.Log; 
    import android.view.GestureDetector; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.widget.Toast; 

    public class SingleTouchEventView extends View implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { 

    private Paint paint = new Paint(); 
    private Path path = new Path(); 

    private static final String DEBUG_TAG = "Gestures"; 
    private GestureDetectorCompat mDetector; 

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

    paint.setAntiAlias(true); 
    paint.setStrokeWidth(6f); 
    paint.setColor(Color.BLACK); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeJoin(Paint.Join.BEVEL); 

    mDetector = new GestureDetectorCompat(context, this); 

    } 

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

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    float eventX = event.getX(); 
    float eventY = event.getY(); 

    this.mDetector.onTouchEvent(event); 
    // Be sure to call the superclass implementation 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     path.moveTo(eventX, eventY); 
     return true; 
    case MotionEvent.ACTION_MOVE: 
     path.lineTo(eventX, eventY); 
     break; 
    case MotionEvent.ACTION_UP: 
     // nothing to do 
     break; 
    default: 
     return false; 
    } 

    // Schedules a repaint. 
    invalidate(); 
    return true; 

    } 

    @Override 
    public boolean onDown(MotionEvent event) { 
     Log.d(DEBUG_TAG,"onDown: " + event.toString()); 
     return false; 
    } 

    @Override 
    public boolean onFling(MotionEvent event1, MotionEvent event2, 
      float velocityX, float velocityY) { 
     Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString()); 
     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent event) { 
     Log.d(DEBUG_TAG, "onLongPress: " + event.toString()); 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) { 
     Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString()); 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent event) { 
     Log.d(DEBUG_TAG, "onShowPress: " + event.toString()); 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent event) { 
     Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString()); 
     return false; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent event) { 

     float width = paint.getStrokeWidth(); 
     width++; 
     paint.setStrokeWidth(width); 
     Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString()); 
     return true; 
    } 

    @Override 
    public boolean onDoubleTapEvent(MotionEvent event) { 
     Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString()); 
     return false; 
    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent event) { 
     Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString()); 
     return false; 
    } 
    } 

这我的活动

package com.example.paint; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(new SingleTouchEventView(this, null)); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
    } 
} 

回答

0

目前,你只存储单个Path

您需要存储多个Path s及其关联的宽度,以便您可以更改每个不同路径的onDraw中的油漆宽度。

+0

你可以举个例子。我尝试用arraylist存储,但仍然无法工作 –

+0

在'onDoubleTap'中,您需要将当前路径和当前strokeWidth一起添加到列表中,并启动一个新路径。然后,在onDraw中,遍历列表,绘制旧的段,然后绘制'this.path'。 – Delyan