鐵人賽
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());