我尽量不打错别字,用词准确,不造成阅读障碍。
这个自定义View是很简单的一个,效果是在拍摄图片时的对焦动画,在自定义SurfaceView中使用这个控件就好了。
效果如下:
代码:
public class FocusView extends View {
private Paint mLinePaint; //画笔
private int mBorderWidth = 4; //圆环的宽
private AnimatorSet animSet;
private ObjectAnimator fadeInOut;
private boolean isFocusing = false;
public FocusView(Context context) {
super(context);
init();
}
public FocusView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public FocusView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
//初始化
private void init() {
mLinePaint = new Paint();
mLinePaint.setAntiAlias(true);
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setColor(Color.parseColor("#45ffffff"));
mLinePaint.setStrokeWidth(mBorderWidth);
this.setAlpha(0f); //初始化设置透明
}
private void setMainColor() {
mLinePaint.setColor(getResources().getColor(R.color.colorPrimaryDark));
postInvalidate();
}
private void reSet() {
mLinePaint.setColor(Color.parseColor("#52ce90"));
postInvalidate();
}
@Override
protected void onDraw(Canvas canvas) {
//其实就是画个圆
canvas.drawCircle(getWidth() / 2, getHeight() / 2, getHeight() / 2 - mBorderWidth / 2, mLinePaint);
}
//开始动画,这个方法暴露给外界调用
public void beginFocus() {
isFocusing = true;
if (animSet == null) {
//设置X轴动画为1倍-->1.3倍-->1倍,也可以使用具体的缩放动画类
ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 1f, 1.3f, 1f);
//设置Y轴动画为1倍-->1.3倍-->1倍,也可以使用具体的缩放动画类
ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 1f, 1.3f, 1f);
animSet = new AnimatorSet();
animSet.play(scaleX).with(scaleY); //设置X轴和Y轴同时执行
animSet.setInterpolator(new LinearInterpolator()); //线性插值器,即匀速执行
animSet.setDuration(1000); //施行时间1秒
animSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
FocusView.this.setAlpha(1f); //在动画开始时显示view
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
setMainColor();
if(fadeInOut == null) {
//在动画结束后启用另一个动画,透明度变化
fadeInOut = ObjectAnimator.ofFloat(FocusView.this, "alpha", 1f, 0f);
fadeInOut.setDuration(500);
fadeInOut.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
reSet();
isFocusing = false;
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
fadeInOut.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
} else {
if(animSet.isRunning()) {
animSet.cancel();
}
if(fadeInOut != null && fadeInOut.isRunning()) {
fadeInOut.cancel();
}
}
animSet.start();
}
public boolean isFocusing() {
return isFocusing;
}
}
大体上是这个思路,具体的圆环样式和动画实现方法可以根据具体的情况更改。
集合了一些简单自定义View的github地址:
https://github.com/longlong-2l/MySelfViewDemo
很简单,没有太多高深的用法,适合学习入门。