动画效果绘制界面——SurfaceView
这种方式适合做小游戏,界面刷新频繁,动画动作比较灵活
推荐一本书:
Android编程之从零开始
package com.example.administrator.androidbase.two;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.hardware.camera2.params.MeteringRectangle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import com.example.administrator.androidbase.R;
/**
* Created by Dujq on 2016/12/22.
*/
public class DrawView extends SurfaceView implements SurfaceHolder.Callback
, Runnable {
private SurfaceHolder holder;
private int bmpX, bmpY;
private Paint paint;
private Thread th;
//线程消亡标志位
private boolean flag;
private Canvas canvas;
private int screenW, screenH;
private Bitmap fishCut;
private Bitmap fish[] = new Bitmap[10];
private int currentFrame = 0;
private boolean isReight = true;
public DrawView(Context context) {
super(context);
holder = this.getHolder();
holder.addCallback(this);
paint = new Paint();
paint.setColor(getResources().getColor(R.color.colorAccent));
//设置焦点,暂时没起作用
setFocusable(true);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
screenH = this.getHeight();
screenW = this.getWidth();
bmpX = 0;
bmpY = screenH / 2;
flag = true;
th = new Thread(this);
for (int i = 0; i < fish.length; i++) {
fish[i] = BitmapFactory.decodeResource(getResources(), R.mipmap.fish0 + i);
}
fishCut = BitmapFactory.decodeResource(getResources(), R.mipmap.fish);
th.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
public void initDraw() {
try {
canvas = holder.lockCanvas();
if (canvas != null) {
//刷新画布.绘制矩形new画布
// canvas.drawRect(0,0,this.getWidth(),this.getHeight(),paint);
canvas.drawColor(getResources().getColor(R.color.white));
if (isReight) {
//画布镜像 画布以x轴180度旋转
canvas.scale(-1, 1, bmpX, 0);
canvas.drawBitmap(fish[currentFrame], bmpX - fish[currentFrame].getWidth(), bmpY - fish[currentFrame].getHeight() / 2, paint);
} else {
//绘制图像,绘制点为图像的左上角
canvas.drawBitmap(fish[currentFrame], bmpX
, bmpY - fish[currentFrame].getHeight() / 2, paint);
}
//.save()与.restore成对出现,添加view
canvas.save();
//设置画布可视大小
canvas.clipRect(bmpX, screenH / 3, bmpX + fishCut.getWidth() / 10, screenH / 3 + fishCut.getHeight());
canvas.drawBitmap(fishCut, bmpX - currentFrame * fishCut.getWidth() / 10, screenH / 3, paint);
canvas.restore();
}
} catch (Exception e) {
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}
@Override
public void run() {
while (flag) {
long start = System.currentTimeMillis();
initDraw();
logic();
long end = System.currentTimeMillis();
try {
// 刷新画布时间强制>=50
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (Exception e) {
}
}
}
/**
* 界面刷新逻辑
*/
private void logic() {
initDirection();
initFrame();
}
private void initDirection() {
if (bmpX > screenW) {
isReight = false;
}
if (bmpX < -fish[currentFrame].getWidth()) {
isReight = true;
}
if (isReight) {
bmpX += 2;
} else {
bmpX -= 2;
}
}
private void initFrame() {
currentFrame++;
if (currentFrame >= fish.length)
currentFrame = 0;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// return super.onTouchEvent(event);
return true;
}
}
public class DrawViewActivity extends Activity {
private DrawView drawView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//隐去标题栏
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//隐去状态栏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
, WindowManager.LayoutParams.FLAG_FULLSCREEN);
drawView = new DrawView(this);
// view.setFocusable(true);
setContentView(drawView);
}
}