自定义View-从0开始
程序员文章站
2024-03-22 21:55:58
...
- 先上一个效果图
代码很简单就不解释了直接上代码 下面的代码都是自己创建的View里,详细介绍都是注释里
/**
* 该View的构造方法
* @param context 这个就不解释了
* @param attrs 里面装着view的一些属性 比如layout_width layout_height id 如果只重写带 context的构参的话 会直接报错提示的是没有这些属性
*/
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initPaint();
}
/**
* 自定义View最基本的笔和纸,这边就是创建笔和给这个笔设置一些属性
*/
public void initPaint() {
mMpaint = new Paint(Paint.ANTI_ALIAS_FLAG); //创建画笔,打开抗锯齿
mMpaint.setColor(Color.BLACK); //设置画笔的颜色
mMpaint.setStyle(Paint.Style.STROKE); //设置描边
mMpaint.setStrokeWidth(10); //设置描边的的宽度
}
@Override
/**
* onDraw 都知道这个方法是系统在渲染View的时候走的回调 drawCircle方法对应的四个参数分别是:圆心的x左边和圆心的Y左边,半径的大小,设置的画笔。
*/
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(MeasureUtil.getScreenSize((Activity) mContext)[0] / 2, MeasureUtil.getScreenSize((Activity) mContext)[1] / 2, small, mMpaint);
}
/**
* 这边开启一个子线程动态的设置该圆的半径,设置半径后调用 postInvalidate()让系统重新绘制view
*/
@Override
public void run() {
while (true) {
try {
if (small < 200) {
small++;
postInvalidate();
} else {
small = 0;
}
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
到这里一个动态的圆就出来了。接下来就是加上渐变动画
Animation alphaAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
mMyview.startAnimation(alphaAnimation);
alphaAnimation.setFillAfter(true);//动画结束后保持状态
//添加动画监听
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
//动画开始时回调
@Override
public void onAnimationStart(Animation animation) {
}
//动画结束时回调
@Override
public void onAnimationEnd(Animation animation) {
}
//动画重复时回调
@Override
public void onAnimationRepeat(Animation animation) {
}
});
new Thread(mMyview).start();
下面是alpha类
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="8400"
android:fromAlpha="1"
android:interpolator="@android:anim/accelerate_interpolator"
android:repeatCount="30000"
android:fillAfter="true"
android:repeatMode="restart"
android:toAlpha="0" />
</set>