让一张图滚动,实现动态效果,只要不断地改变x轴或y轴的坐标。
在工程中新建一个类MySurfaceView,继承SurfaceView,然后把MainActivity中的标题栏,和提示栏去掉,并且设置显示SurfaceView实例。
public class MainActivity extends Activity {
@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);
setContentView(new MySurfaceView(this));
}
}
然后在MySurfaceView中初始化:
// 声明一张位图
private Bitmap bitmap;
//声明x,y坐标
private int x,y;
视图的构造函数:
public void surfaceCreated(SurfaceHolder holder) {
bitmap=BitmapFactory.decodeResource(this.getResources(),R.drawable.background);
//使其下部正好填满整个屏幕
X=this.getWidth()-bitmap.getWidth();
Y=this.getHeight()-bitmap.getHeight();
}
绘制图片
private void myDraw() {
Canvas canvas=sfh.lockCanvas();//获取canvas
canvas.drawBitmap(bitmap, X, Y, paint);//画背景
canvas.drawBitmap(bitmap, X, Y-bitmap.getHeight(), paint);//画背景连续
//当第一幅画被显示完,将坐标恢复原值,循环显示
if(Y>this.getHeight()){
Y=this.getHeight()-bitmap.getHeight();
}
sfh.unlockCanvasAndPost(canvas);//解锁画布和提交
}
修改y值,实现动态
public void logic(){
Y+=3;
}
最后在线程中调用之前的两个函数,实现页面的刷新,使图片动起来。
public void run() {
while(flag){
myDraw();
logic();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
一张图片背景动态显示就完成啦。
下面是整体的MySurfaceView中的代码
package com.example.game_myview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/*
* 通过 SurfaceHolder获取本页的canvas,然后再进行绘制,所以没有onDraw方法,要自定义myDraw
*/
public class MySurfaceView extends SurfaceView implements Callback,Runnable{
private SurfaceHolder sfh;
private Paint paint;
private Bitmap bitmap;
private int bitX,bitY;
private Thread th;
private static boolean flag;
public MySurfaceView(Context context) {
super(context);
sfh=this.getHolder();
sfh.addCallback(this);//添加状态监听
paint=new Paint();
paint.setColor(Color.WHITE);
setFocusable(true);
}
/* 视图建立,响应这个函数
* 获取位图,调用onDraw
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
bitmap=BitmapFactory.decodeResource(this.getResources(),R.drawable.use3);
//位图初始换坐标填充屏幕
bitX=this.getWidth()-bitmap.getWidth();
bitY=this.getHeight()-bitmap.getHeight();
flag=true;
th=new Thread(this);
th.start();
}
/*
* 自定义绘图函数
*/
private void myDraw() {
Canvas canvas=sfh.lockCanvas();//获取canvas
canvas.drawBitmap(bitmap, bitX, bitY, paint);//画背景
canvas.drawBitmap(bitmap, bitX, bitY-bitmap.getHeight(), paint);//画背景连续
//当第一幅画被显示完,将坐标恢复原值,循环显示
if(bitY>this.getHeight()){
bitY=this.getHeight()-bitmap.getHeight();
}
sfh.unlockCanvasAndPost(canvas);//解锁画布和提交
}
//逻辑函数
public void logic(){
bitY+=5;
}
@Override
public void run() {
while(flag){
myDraw();
logic();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag=false;
}
}
上传了飞机大战的图片