`
byandby
  • 浏览: 1696435 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

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

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

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

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

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


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





下边我们就来看看示例代码吧。
    我们一共定义了两个类  其中一个是 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   大家感兴趣可以去附件下载源码。
  • 大小: 42.1 KB
  • 大小: 44.2 KB
  • 大小: 45.1 KB
3
1
分享到:
评论

相关推荐

    Acer Ferrari 4000笔记本

    Acer Ferrari 4000笔记本是一款融合了高级设计与卓越技术的标志性产品,它是宏碁与法拉利合作的产物,体现了两家公司在创新与性能上的极致追求。这款笔记本的外观设计独具匠心,采用了法拉利一级方程式赛车中应用的...

    红色法拉利599XX跑车模型 Ferrari 599.zip

    标题中的“红色法拉利599XX跑车模型 Ferrari 599.zip”表明这是一个关于法拉利599XX超级跑车的3D模型压缩包文件。法拉利599XX是一款由意大利豪华汽车制造商法拉利于2009年推出的高性能限量版车型,主要用于赛道驾驶...

    IBM移动平台Aglets 2.0.2中文手册之绪论

    Aglets是IBM开发的一种移动代理平台,最初由IBM日本东京研究实验室创造,其设计目标是提供一个简单易用、高度可定制和可扩展的环境,用于构建分布式计算应用。Aglets的特点在于它提供了清晰的API,使得开发者可以...

    一款红与黑的法拉利ubuntu主题

    然而,不同桌面环境的兼容性可能有所不同,因此在非Ubuntu系统上使用时,可能需要进行额外的适配工作。 Linux社区鼓励用户自定义和分享他们的桌面环境,这使得Linux成为了一个充满创新和个性化的操作系统。这款红与...

    Acer Ferrari 3400笔记本

    在图形性能上,Ferrari 3400配备了ATI MOBILITYTM RADEONTM 9700显卡,拥有128 MB独立显示内存,为用户带来了卓越的3D游戏体验和高清视频播放效果。15英寸的200流明亮度液晶显示屏,保证了图像的清晰度和色彩饱和度...

    新款法拉利California原车屏幕升级导航-法拉利California加装手写凯立德导航.doc

    新款法拉利California原车屏幕升级导航-法拉利California加装手写凯立德导航.doc

    效果超棒的Webgl模型-法拉利跑车

    1. **坐标系统**:WebGL使用右手坐标系统,原点在屏幕中心,X轴正方向向右,Y轴正方向向上,Z轴正方向向屏幕内部。 2. **顶点和索引**:3D模型由多个顶点组成,每个顶点包含位置、颜色、纹理坐标等信息。索引则用来...

    移动游戏和互动娱乐全球纵览-英文版.pptx

    综上所述,移动游戏不仅在市场规模上迅速扩大,而且在游戏内容、技术实现和用户体验上也取得了显著的进步。从简单的休闲游戏到深度的角色扮演游戏,再到具有高度交互性的多人在线游戏,移动游戏市场展示了其无限的...

    法拉利汽车obj格式模型

    在这个“法拉利汽车obj格式模型”中,我们有两个核心文件:`fll.mtl` 和 `fll.obj`。`fll.obj` 文件包含了模型的几何信息,如顶点、边和面,以及相关的纹理坐标。Obj文件以文本形式存储,易于读取和编辑,但因为不...

    ferrari-master.rar

    标题"Ferrari-Master.rar"暗示我们关注的焦点是一个与法拉利品牌或者与赛车相关的项目,而实际的描述却提到了"通过管理界面进行quartz任务管理"。这表明,尽管标题可能具有误导性,但实际内容是关于使用Quartz调度器...

    法拉利 ferrari 1952 gp汽车3D图纸-STP格式.zip

    标题 "法拉利 ferrari 1952 gp汽车3D图纸-STP格式.zip" 提供的信息主要聚焦在两个核心点:法拉利1952 GP(Grand Prix)赛车和STP(STEP)格式的3D图纸。这表明内容包含的是关于1952年法拉利GP赛车的三维设计模型,且...

    Ferrari_Win7Theme windows7主题

    Ferrari_Win7Theme windows7主题

    移动游戏和互动娱乐全球纵览英文版.pptx

    这些游戏不仅在技术上有所突破,如Orange SPV手机拥有132 MHz处理器、16 MB RAM和65k色220x176分辨率屏幕,使得游戏画面更加逼真,同时也面临更高的玩家期待。例如,First Star的《Boulder Dash》是一款结合了策略...

    互动娱乐与移动游戏全球纵览(英文版).ppt

    【互动娱乐与移动游戏全球纵览】的报告揭示了移动游戏产业在全球的快速发展。报告由WGR Media Inc和Gamelet.com编纂,涵盖了各种数据和分析,旨在展示无线游戏市场的潜力和增长趋势。 报告指出,2001年全球电子游戏...

    法拉利网络广告策划书.doc

    产品分析聚焦于458 Italia车型,它是法拉利在2009年法兰克福车展上推出的革新之作。458 Italia搭载4.5升8缸发动机,代表了法拉利在中后置发动机跑车领域的技术突破。Pininfarina设计的未来感造型为法拉利带来了全新...

    法拉利+CPU+仪表盘

    这个小工具的“法拉利”元素可能体现在其外观设计上,例如,它的界面可能模仿法拉利跑车的仪表盘,用鲜艳的颜色、速度表的样式来展示CPU的负载情况。用户可以通过它快速了解电脑的运行状态,比如CPU的使用率、温度等...

    Banner:Android轮播图

    虽然有点盗窃前辈的劳动成果,但也算是实实在在在前辈的身边上干了点实在事-帮前辈梳了梳头,整理了一下发型。毕竟盲仔说过:头可断,发型不能乱。但是在下还是得由衷感谢前辈,您造的法拉利我至少给您保养了一番! ...

    移动游戏和互动娱乐全球纵览.ppt

    这款游戏展现了移动游戏在联网功能上的创新。 Gameloft的《Gulo's Tale》(未提供详细信息)也是一款移动游戏,可能包含丰富的故事情节和游戏玩法,旨在吸引各种类型的玩家。 总体来看,移动游戏市场在全球范围内...

Global site tag (gtag.js) - Google Analytics