在android屏幕上 上 下 左 右 四个方向移动法拉利(Image)

在Android中,项目目录下的"res\drawable" 用来设置该项目的一些图片资源,那么如何来显示这些图片资源呢?Android中提供了Bitmap来存放这些资源,如果大家对android的画图和Animation还不熟悉的话,可以看这里推荐的文章,介绍比较全面[url]http://byandby.iteye.com/blog/827527[/url]

如下代码可以通过一个资源索引获得其图像对象的Bimmap 关于获取图片位图的2种方法请参见这里[url]http://byandby.iteye.com/blog/828732[/url]

((BitmapDrawable) getResources().getDrawable(索引资源)).getBitmap()
这样就可以得到图片资源的Bitmap对象了。

然后使用drawBitmap方法将图片显示到屏幕上。如下代码将一个名为bitmap的Bitmap对象显示在( x , y )坐标上。

canvas.drawBitmap(bitmap, x, y, null);


Bitmap还提供了一些方法,比如getHeight方法和getWidth方法可以获取这个图片的高度和宽度。下面的示例 将显示怎么使用这些方法。这个示例 实现了 图片移动 可以 上下移动 左右移动,移动到手机屏幕的不同地方。通过手机的上下左右键来控制。我们先来看看运行效果。

[img]http://dl.iteye.com/upload/attachment/356294/c771a5bf-fc4c-38cf-a702-5f85cfbcf520.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/356296/38848ae3-8400-3b3d-a664-06a0822559a4.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/356298/31e9b124-fdcd-375d-b347-3fdd1c0825a3.jpg[/img]

下边我们就来看看示例代码吧。
我们一共定义了两个类 其中一个是 Activity01类 用来设置布局
Activity01
package xiaohang.zhimeng;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

public class Activity01 extends Activity {

private GameView mGameView = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mGameView = new GameView(this);

setContentView(mGameView);

}

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mGameView == null) {
return false;
}
return mGameView.onKeyDown(keyCode, event);
}
}


另外一个是我们的GameView类 是我们自己定义的一个View类用来实现 事件的监听,以及图片的移动。
GameView
package xiaohang.zhimeng;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

public class GameView extends View implements Runnable {

// 声明Paint对象
private Paint mPaint = null;

// 创建两个图片对象
Bitmap mBitmapQQ = null;
Bitmap mBitDestTop = null;

int miDTX = 0;
int miDTY = 0;

public GameView(Context context) {
super(context);

mPaint = new Paint();
miDTX = 0; // 代表图片左边的横坐标 用来左右移动图片
miDTY = 170;// 代表图片上边的纵坐标 用来上下移动图片
/* 从资源文件中装载图片 */
// getResources()-->得到Resources
// getDrawable()-->得到资源中的Drawable对象,参数为资源索引ID
// getBitmap()-->得到Bitmap
mBitmapQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.xh))
.getBitmap();

mBitDestTop = ((BitmapDrawable) getResources().getDrawable(
R.drawable.chrysler)).getBitmap();
new Thread(this).start();
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/* 清屏效果 */
canvas.drawColor(Color.GRAY);

/* 在屏幕(0,0)处绘制图片mBitQQ */
GameView.drawImage(canvas, mBitmapQQ, 0, 0);

/* 在指定位置按指定裁剪的区域进行绘制 */
// getWidth()-->得到图片的宽度
// getHeight()-->得到图片的高度
GameView.drawImage(canvas, mBitDestTop, miDTX, miDTY, mBitDestTop
.getWidth(), mBitDestTop.getHeight(), 0, 0);
}

// 触笔事件
public boolean onTouchEvent(MotionEvent event) {
return true;
}

// 按键按下事件
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 左方向键
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
if (miDTX > 0) {
miDTX -= 4;
}
}
// 右方向键
else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
if (miDTX + mBitDestTop.getWidth() < 320) {
miDTX += 4;
}
}
// 上方向键
else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
if (miDTY > 0) {
// miDTY + mBitDestTop.getHeight() < 450
miDTY -= 4;
}
}
// 下方向键
else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
if (miDTY < 322) {
miDTY += 4;
}
}
return true;
}

// 按键弹起事件
public boolean onKeyUp(int keyCode, KeyEvent event) {
return false;
}

public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
return true;
}

// 线程处理
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 使用postInvalidate可以直接在线程中更新界面
postInvalidate();
}
}

/*---------------------------------
* 绘制图片
* @param x屏幕上的x坐标
* @param y屏幕上的y坐标
* @param w要绘制的图片的宽度
* @param h要绘制的图片的高度
* @param bx图片上的x坐标
* @param by图片上的y坐标
*
* @return null
------------------------------------*/

public static void drawImage(Canvas canvas, Bitmap blt, int x, int y,
int w, int h, int bx, int by) {
Rect src = new Rect();// 图片 >>原矩形
Rect dst = new Rect();// 屏幕 >>目标矩形

src.left = bx;
src.top = by;
src.right = bx + w;
src.bottom = by + h;

dst.left = x;
dst.top = y;
dst.right = x + w;
dst.bottom = y + h;
// 画出指定的位图,位图将自动--》缩放/自动转换,以填补目标矩形
//这个方法的意思就像 将一个位图按照需求重画一遍,画后的位图就是我们需要的了
canvas.drawBitmap(blt, null, dst, null);
src = null;
dst = null;
}

/**
* 绘制一个Bitmap
*
* @param canvas
* 画布
* @param bitmap
* 图片
* @param x
* 屏幕上的x坐标
* @param y
* 屏幕上的y坐标
*/

public static void drawImage(Canvas canvas, Bitmap bitmap, int x, int y) {
// 绘制图像 将bitmap对象显示在坐标 x,y上
canvas.drawBitmap(bitmap, x, y, null);
}

}


测试平台android 2.0 大家感兴趣可以去附件下载源码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值