显示屏长时间显示同一个画面,时间长了会存在烧屏现象,在所在区域存在残影。为了防止烧屏。在界面上写一个小动画就可以。一个运动的小球,在碰到边框后反弹,一直弹弹弹就可以了。
自定义个小球类:
import android.graphics.Bitmap;
public class Ball implements Cloneable {
public float vX;//X方向的速度
public float vY;//Y方向的速度
public float x;//X坐标
public float y;//Y坐标
public Bitmap iconBitmap; //小球图标
public Ball clone() {
Ball clone = null;
try {
clone = (Ball) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
然后定义view
public class RunBall extends View {
private static final String TAG = "RunBall";
private ValueAnimator mAnimator;//动画的时间轴,让小球动起来,
private Ball mBall;//小球对象
private Paint mPaint;//主画笔
private Point mCoo;//坐标系
private float defaultVX = 2;//默认小球x方向速度
private float defaultVY = 2;//默认小球y方向速度
private float mMaxX = 704;//X轴的边界最大值,获取屏幕宽高设置这个值
private float mMinX = 0;//X轴最小值,以左上角为0,0
private float mMaxY = 960;//Y轴边界最大值,获取屏幕宽高设置这个值
private float mMinY = 0;//Y轴最小值
public RunBall(Context context) {
this(context, null);
}
public RunBall(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mCoo = new Point(0, 0);// 坐标的起始位置
//初始化小球
mBall = new Ball();
mBall.vX = defaultVX;
mBall.vY = defaultVY;
//小球的图标,需要对应的资源文件
mBall.iconBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.bb);
//初始画笔
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
//初始化时间轴ValueAnimator
mAnimator = ValueAnimator.ofFloat(0, 1);
mAnimator.setRepeatCount(-1);
mAnimator.setDuration(1000);
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
updateBall();
invalidate();
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mCoo.x, mCoo.y);
drawBall(canvas, mBall);
canvas.restore();
}
/**
* 绘制小球
* @param canvas
* @param ball
*/
private void drawBall(Canvas canvas, Ball ball) {
//用画笔画出小球
canvas.drawBitmap(ball.iconBitmap, ball.x, ball.y, mPaint);
}
/**
* 更新小球
*/
private void updateBall() {
//更新小球位置,如果超出边界就反向改坐标
mBall.x += mBall.vX;
mBall.y += mBall.vY;
if (mBall.x > mMaxX) {
mBall.vX = -mBall.vX;
}
if (mBall.x < mMinX) {
mBall.vX = -mBall.vX;
}
if (mBall.y > mMaxY) {
mBall.vY = -mBall.vY;
}
if (mBall.y < mMinY) {
mBall.vY = -mBall.vY;
}
}
public void onRunBallStart(){
mAnimator.start();//开启动画
}
public void onRunBallPause(){
mAnimator.pause();//暂停动画
}
}
然后在xml文件使用自定义view,控件大小为全屏
<com.view.RunBall
android:id="@+id/rb_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
/>
最后findViewById 初始化,调用start 小球就运动起来了
runBallMain = findViewById(R.id.rb_main);
runBallMain.onRunBallStart();