iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
Mobile Development

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

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

  • 分享至 

  • xImage
  •  

「抓一隻波波,當場變成百變怪」這在寶可夢是可能的,但鐵人賽沒機會,認真寫吧!/images/emoticon/emoticon08.gif


tags: 鐵人賽 Templates

現在來主要用在set各種paintValue吧跟實作功能!!!!

1.設定寬度
由外界傳入你要設定的寬度是多少,我主要用的是progress拖拉設定
invalidate是更新的部分會重新跑onDraw()

    public void setWidth(int progress){
        Log.d("qqqqq",""+(100F/progress)*10F+"progress"+progress);
        paintValue.setPaintWidth((float) progress);
        Log.d("qqqqQAQ",""+paintValue.getPaintWidth());
        invalidate();
    }

2.設定顏色跟透明度
主要是用ColorUtils方法可以將顏色跟想要的透明度結合

https://developer.android.com/reference/androidx/core/graphics/ColorUtils

   public void setColor(int color,int transparent){
        int chCl= ColorUtils.setAlphaComponent(color,transparent);
        paintValue.setColor(chCl);
        Log.d("coloraaaaaa","cl"+chCl);
        invalidate();
    }

3.設定橡皮擦
橡皮擦設計主要是看現在背景是甚麼顏色所第,要是是白色,橡皮擦就是白的筆

   public void eraserIt(){
        isEraser=!isEraser;
        paintValue.setErase(isEraser);
        invalidate();
    }

注:PaintValue內記得多設一個是否用橡皮擦的boolean
且在MoveEvent.ActionUp內加上

  if (isEraser){
                    pp.setColor(Color.WHITE);
                }else {
                    pp.setColor(Color.BLACK);
                }

4.跟IG很像的功能

常按一個點改變背景色

在MotionEvent.ACTION_DOWN加上:

 downTime=event.getDownTime();

在MotionEvent.ACTION_MOVE加上
主要是判斷down跟move的點是不是很近,就是判斷是否按同一個點!!
是的話將畫布清空並改變背景色為畫筆當前顏色,橡皮擦顏色也改變為畫筆當前顏色

downTime的判斷為是否長按

  if (((event.getEventTime()-downTime)>2000)&&( ((Math.abs(clickx-x)<30) &&(Math.abs(clicky-y)<30)) )){
                    linkedHashMap.clear();
                    lastHashMap.clear();
                    defaultEraserColor=paintValue.getColor();
                    Log.d("coloraaaaaa","defaultEraserColor"+defaultEraserColor);
                    setBackgroundColor(defaultEraserColor);
                }

5.上一步
拿紀錄筆畫的map,最後一筆就是要上一步那個筆畫,將他移出map
而因為要實作下一步所以需要有個紀錄上一步掉的map加入被取消的筆畫

public void back(){
    DrawPath path=getLastKey(linkedHashMap);
    PaintValue paintValue=getLastValue(linkedHashMap);
    Log.d("bacccccccc", "back: "+paintValue.getColor());
    linkedHashMap.remove(path);
         lastHashMap.put(path,paintValue);
    invalidate();
}

注:如有錯記得加入這段
主要為判斷筆畫跟value是否為空

    if ((paintValue!=null)&&(path!=null)){
        lastHashMap.put(path,paintValue);
    }

6.next 下一步
將之前紀錄消去筆畫的map在拿出最後一筆加回去之前的
一樣要紀錄map是否空值

   public void next(){
        DrawPath ph=getLastKey(lastHashMap);
        PaintValue pv=getLastValue(lastHashMap);
        Log.d("bacccccccc", "next: "+pv.getColor());
        if ((ph!=null)&&(pv!=null)){
            linkedHashMap.put(ph,pv);
            lastHashMap.remove(ph);
            invalidate();
        }
    }

map getLastValue 跟 getLastKey方法在這

    public PaintValue getLastValue(Map<DrawPath,PaintValue> ll) {
        PaintValue out = new PaintValue();
        for (PaintValue key : ll.values() ){
            out = key;
        }
        return out;
    }
 public DrawPath getLastKey(Map<DrawPath,PaintValue> ll) {
        DrawPath out = null;
        for (DrawPath key : ll.keySet()) {
            out = key;
        }
        return out;
    }

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

尚未有邦友留言

立即登入留言