自定义view - 草稿

2017-12-02  本文已影响0人  水固态中

xml引用自定义view 包名+控件名

<com.mycompany.myapphuizhi.NewButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

新建类,继承view,重写ondraw方法

public class NewButton extends View {
  Paint paint = new Paint();//画笔
        //注意构造函数,最起码要实现这个attrs属性从xml传入
  public NewButton(Context context,  AttributeSet attrs) {
  super(context, attrs);
  }
  @Override
  public void draw(Canvas canvas) {
  //canvas画布
  super.draw(canvas);
        paint.setColor(Color.YELLOW);
  canvas.drawCircle(300, 300, 200, paint);
  }
}

坐标系

自定义view - 草稿

canvas画布

底板

canvas.drawRGB(100, 200, 100); 
canvas.drawARGB(100, 100, 200, 100); 
canvas.drawColor(Color.parseColor("#88880000")); // 半透明红色
canvas.drawColor(Color.BLACK);  // 纯黑 

形状

drawCircle(centerX, centerY, radius, paint)

paint画笔

Paint.setStyle(Style style) 设置绘制模式

paint.setStyle(Paint.Style.STROKE) 来把绘制模式改为画线模式。

Style 具体来说有三 种: FILL, STROKE 和 FILL_AND_STROKE 。FILL 是填充模式,STROKE 是画线模式(即勾边模式),FILL_AND_STROKE 是两种模式一并使用:既画线又填充。它的默认值是 FILL,填充模式。

自定义view - 草稿

Paint.setColor(int color) 设置颜色

默认黑色

paint.setColor(Color.YELLOW);
自定义view - 草稿

Paint.setStrokeWidth(float width) 设置描边线条宽度

在 STROKE 和 FILL_AND_STROKE 下,还可以使用 paint.setStrokeWidth(float width) 来设置描边线条的宽度:

paint.setStyle(Paint.Style.STROKE); 
paint.setStrokeWidth(20); // 线条宽度为 20 像素 
canvas.drawCircle(300, 300, 200, paint); 
自定义view - 草稿

抗锯齿

在绘制的时候,往往需要开启抗锯齿来让图形和文字的边缘更加平滑。开启抗锯齿很简单,只要在 new Paint() 的时候加上一个 ANTI_ALIAS_FLAG 参数就行:

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
自定义view - 草稿

Paint.setTextSize(float textSize) 设置文字大小

Paint.setAntiAlias(boolean aa) 设置抗锯齿

绘制顺序

自定义view - 草稿

背景,它的绘制发生在一个叫 drawBackground() 的方法里,但这个方法是 private 的,不能重写,你如果要设置背景,只能用自带的 API 去设置(xml 布局文件的 android:background 属性以及 Java 代码的 View.setBackgroundXxx() 方法,这个每个人都用得很 6 了),而不能自定义绘制;而第 4、5 两步——滑动边缘渐变和滑动条以及前景,这两部分被合在一起放在了 onDrawForeground() 方法里,这个方法是可以重写的。

draw() 总调度方法

// View.java 的 draw() 方法的简化版大致结构(是大致结构,不是源码哦):

public void draw(Canvas canvas) { 
    ...
    drawBackground(Canvas); // 绘制背景(不能重写)
    onDraw(Canvas); // 绘制主体
    dispatchDraw(Canvas); // 绘制子 View
    onDrawForeground(Canvas); // 绘制滑动相关和前景
    ...
}

待续

上一篇下一篇

猜你喜欢

热点阅读