iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
1
Mobile Development

Android 開發經驗三十天系列 第 16

[Android 開發經驗三十天]#D16一自定義View小畫家 (中)

  • 分享至 

  • xImage
  •  
tags: 鐵人賽 Templates

今天來做出基礎的畫畫功能吧!

public class PPView extends View {
..}

先創一個constructor,因為上篇文章有講
畫筆需要的有顏色,粗細,跟style
這樣只要創一個ppView就有黑色實心粗度10F的畫筆了

public Paint paint;
private float preX, preY;

private Map<DrawPath,PaintValue> linkedHashMap=new LinkedHashMap<>();
private Map<DrawPath,PaintValue> lastHashMap=new LinkedHashMap<>();

private DrawPath drawPath=new DrawPath();
private PaintValue paintValue=new PaintValue();
private int defaultEraserColor= Color.WHITE;
public PPView(Context context, AttributeSet attrs) {
    super(context, attrs);
    paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(10F);
}

2.自定義View要用到的幾個作法

2.1 onDraw()
真正畫出view的地方,map的key是path相關(主要紀錄路徑),value是跟畫筆相關
主要是拿取到所有list 一筆一筆畫上
外層為何還要一層drawpath呢 主要是即時畫上

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (Map.Entry<DrawPath,PaintValue> entry : linkedHashMap.entrySet()) {
            Log.d("puttQAQ","color"+entry.getValue().getColor());
          
            canvas.drawPath(entry.getKey(),paint);
        }
     
        canvas.drawPath(drawPath,paint);
    }

2.2
紀錄手指移動當作畫筆

紀錄移動狀態可以用
@Override
public boolean onTouchEvent(MotionEvent event) {..}

float x,y是當前你碰觸/移動點的x,y

float x = event.getX();
float y = event.getY();

用switch case判斷現在的event是什麼,在做出之後的行動
switch (event.getAction()) {
case ...
}
event分成三種
1.MotionEvent.ACTION_DOWN
為按下去
以畫畫來說可以想成是按下去那點的意思
這時候path應該要紀錄移動(起始點)
用的方法就是moveTo
而要reset是因為這已經是下path了,應該要完全重製

  drawPath.reset();
                drawPath.moveTo(x,y);
                preX = x;
                preY = y;

2.MotionEvent.ACTION_MOVE
為滑動or移動的過程,即使按同個點也會有
移動的時候應該用quadTo
prex,prey為down時候的點

 drawPath.quadTo(preX,preY, (x + preX) / 2, (y + preY) / 2);
                preX = x;
                preY = y;

3.MotionEvent.ACTION_UP
手指移開的時候,這時候應該要畫出剩餘的線
為lineTo

drawPath.lineTo(preX,preY);
                if (preX==x&&preY==y){
                    drawPath.lineTo(x,y+2);
                    drawPath.lineTo(x+1,y+2);
                    drawPath.lineTo(x+1,y);
                }

外層:
應該要把path跟paintValue加入list這樣在draw的時候才能draw出所有path與他的paintValue

 PaintValue pp=new PaintValue();
   linkedHashMap.put(drawPath,paintValue);
                drawPath=new DrawPath();
                paintValue=new PaintValue(paintValue.getColor(),paintValue.getPaintWidth(),paintValue.getErase());

上一篇
[Android 開發經驗三十天]D15一自定義小畫家(上) 基本介紹
下一篇
[Android 開發經驗三十天]#D17一自定義View小畫家 (下)
系列文
Android 開發經驗三十天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言