马上暑假要去某公司实习,做的手机动效开发,现记录学习的点滴,希望能坚持不懈......第一次写博客,文笔排版都很烂,请见谅
需求:一个圆形控件:底层圆上有一个圆按照两条贝塞尔曲线做循环运动。圆直径60dp,以下坐标均以圆心为坐标原点
效果预览:
实现要点:
一、自定义控件
自定义控件主要有以下三种写法。
- 扩展 -- 对现有控件进行扩展
- 组合 -- 将不同的控件组合在一起形成新的空间
- 重写 -- 通过重写来实现全新的控件
本次控件为第三种,主要是重写onDraw函数,在onDraw函数中绘制出需要的样子。
自定义控件的三个构造函数:
(1)一个参数的构造方法:
是提供给java代码中直接new 出来用的,比如TextView tv = new Text(context);这样我们就可以有时候不用写一个布局再用里面的tv来进行设置数据了。比较方法使用。
(2)两个参数的构造方法:
里面多了一个AttributeSet 这个单词是合成词,分开就是Attribute Set,属性集合的意思,就是在你使用自定义的属性的时候回用到这个AttributeSet 来获取你的自定义属性的以及对于数据使用的。
(3)三个参数的构造方法:
又多了一个style,这个是你在xml里面用到了style才使用的。
public MovingCircle(Context context) {
this(context,null);
}
public MovingCircle(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public MovingCircle(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
circlePaint=new Paint();
circlePaint.setColor(0xFFAEEEEE);
circlePaintUp=new Paint();
circlePaintUp.setColor(Color.GREEN);
paint=new Paint();
paint.setColor(0xFF080808);
path=new Path();
paint.setStyle(Paint.Style.STROKE);
pathMeasure=new PathMeasure();
radius=dip2px(context,30);
A=new Point(radius-dip2px(context,82),radius-dip2px(context,5));
B=new Point(radius-dip2px(conte