直接上代码了,代码注释详细
class MyView extends View
{
// 记录背景位图的实际高度
final int BACK_HEIGHT = 1700;
// 背景图片
private Bitmap back;//创建Bitmap对象,其实就代表一张图片
private Bitmap plane;
// 背景图片的开始位置
public int WIDTH;
public int HEIGHT;
private int startY = BACK_HEIGHT - HEIGHT;
public float currentX;
public float currentY;
private float Touchx;
private float Touchy;
// 定义飞机的移动速度
private int speed = 10;
// 定义、并创建画笔
Paint p = new Paint();//Cavas画画需要定义画笔
public MyView(Context context)
{
super(context);
//BitmapFactory是个类,用于使用其中的方法来解析创建Bitmap(图片)对象的
back = BitmapFactory.decodeResource(context.getResources(),
R.drawable.back_img);
plane = BitmapFactory.decodeResource(context.getResources(),
R.drawable.plane);
//定时器用于定时改变背景图片坐标的
final Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
if (msg.what == 0x123)
{
// 重新开始移动
if (startY <= 3)
{
startY = BACK_HEIGHT - HEIGHT;
}
else
{
startY -= 3;
}
}
invalidate();//改变了截屏的坐标从新像是就跟动态的是的了
}
};
new Timer().schedule(new TimerTask()
{
@Override
public void run()
{
handler.sendEmptyMessage(0x123);
}
}, 0, 100);//100ms,时间长了会看出来一顿一顿的
}
//此类是继承VIEW的其实是一个绘图,重写onDraw方法即可完成绘图,无需调用,调用invalidate();可进行重画,也就是再次调用了次方法
//不断重复调用onDraw方法就完成了动画效果,也就是更新XY后调用invalidate();
//如果为了每个更新的图片调用自己的onDrow,新建函数就可以,无非是不调用invalidate()调用自己的函数呗eg:public void zjk(Canvas canvas){}
//只要将要花的东西放在两个类中,在ACTIVITY中分别调用其ondraw就好了 不用在一个类中重建函数,这样运行
//在activit的XML中创建自己画的组件就好
//背景图调用频繁,灰机不动的话其实是浪费资源,但是不重画灰机又怕灰机就没了,用framelayout布局就好
//第一个创建的组建在最底层
@Override
public void onDraw(Canvas canvas)
{
// 根据原始位图和Matrix创建新图片
//从原始图片中挖出一屏幕的图片来显示,
Bitmap bitmap2 = Bitmap
.createBitmap(back, 0, startY, WIDTH, HEIGHT); // ①
// 绘制新位图
canvas.drawBitmap(bitmap2, 0, 0, p);
// 绘制飞机
canvas.drawBitmap(plane, currentX, currentY, p);
}
//触摸时间控制灰机移动的,里面的移动算法有点菜
public boolean onTouchEvent(MotionEvent event)
{
// 获取手的位置
Touchx = event.getRawX();
Touchy = event.getRawY();
//左上方
if(Touchx
{
if((Touchx+speed)
{
currentX-=speed*2/3;
currentY-=speed;
}
if((Touchx+speed)currentY)
{
currentX-=speed;
}
if((Touchx+speed)>currentX && (Touchy+speed)
{
currentY-=speed;
}
}
//右上方
if(Touchx>currentX && Touchy
{
if((Touchx-speed)>currentX && (Touchy+speed)
{
currentX+=speed*2/3;
currentY-=speed;
}
if((Touchx-speed)
{
currentY-=speed;
}
if((Touchx-speed)>currentX && (Touchy+speed)>currentY)
{
currentX+=speed;
}
}
//左下方
if(TouchxcurrentY)
{
if((Touchx+speed)currentY)
{
currentX-=speed*2/3;
currentY+=speed;
}
if((Touchx+speed)
{
currentX-=speed;
}
if((Touchx+speed)>currentX && (Touchy-speed)>currentY)
{
currentY+=speed;
}
}
//右下方
if(Touchx>currentX && Touchy>currentY)
{
if((Touchx-speed)currentY)
{
currentY+=speed;
}
if((Touchx-speed)>currentX && (Touchy-speed)
{
currentX+=speed;
}
if((Touchx-speed)>currentX && (Touchy-speed)>currentY)
{
currentX+=speed*2/3;
currentY+=speed;
}
}
// 通知planeView组件重绘,就是重新调用了onDraw方法
invalidate();
return true;
}
}