Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 944|回复: 0

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

[复制链接]

该用户从未签到

发表于 2011-10-24 14:40:07 | 显示全部楼层 |阅读模式
Android中,项目目录下的"res\drawable" 用来设置该项目的一些图片资源,那么如何来显示这些图片资源呢?Android中提供了Bitmap来存放这些资源

如下代码可以通过一个资源索引获得其图像对象的Bimmap 关于获取图片位图的2种方法请参见这里http://www.apkbus.com/forum.php?mod=viewthread&tid=1740

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

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

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








下边我们就来看看示例代码吧。
    我们一共定义了两个类  其中一个是 Activity01类 用来设置布局
    Activity01
Java代码
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
Java代码
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   大家感兴趣可以去附件下载源码。

Xh_05_07_Test.rar (332.21 KB, 下载次数: 27)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:40:11 | 显示全部楼层

Re:在android屏幕

不错!!!!挺有意思
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:40:15 | 显示全部楼层

Re:在android屏幕

看看附件学习代码
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:40:20 | 显示全部楼层

Re:在android屏幕

不错,顶个!
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2011-10-24 14:40:24 | 显示全部楼层

Re:在android屏幕

这个不错!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:40:34 | 显示全部楼层

Re:在android屏幕

谢谢分享!!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:40:38 | 显示全部楼层

Re:在android屏幕

ok 谢谢 很适合我的第一个学习例子
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:40:41 | 显示全部楼层

Re:在android屏幕

下载学习喽,支持楼主
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:40:45 | 显示全部楼层

Re:在android屏幕

顶顶更健康
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 12:02 , Processed in 0.322002 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表