一个将图片展示到手机屏幕,并让其不停的浮动的效果

 

我们做

Android

程序的时候,有时候需要显示图片在界面上,这里我们将实现

一个将图片展示到手机屏幕,并让其不停的浮动的效果!

 

       

首先我们要先准备一张图片,在这里我准备了一张图片,如下:

 

 


 

 

       

将此图片放到文件夹

"res->drawable-*dpi"

下,记得,三个文件夹都要

放,因为系统会根据不同的分辨率去取不同的图片,如果有的没放,在某些分辨

率下,会找不到资源。将此图片重命名为“

pic.png

”,在

R.java

里的

drawable

类里会生成一个

pic

的常量。

 

       

图片要显示,

就是要容器可以让其显示,

因为所有的

Android

UI

组件

都是继承自

View

View

也实现了

Drawable

接口,所以在此,我们也重新定义一

View

让其用来显示我们的这张图片,并让这张图片浮动。我们创建一个在包

org.leo.bitmap

”下的,类名为“

MovingPictureView

”的类,该类继承自

android.view.View

。此类目前代码大致如下:

 

public class MovingPictureView extends View {

 public MovingPictureView(Context context) {

  super(context);

 }

 

 @Override

 protected void onDraw(Canvas canvas) {

 

super.onDraw(canvas);

 

 }

}

 

我们要重载他的

onDraw

方法,

这个方法就是

Android

框架展现

View

的时候用

来绘制显示内容那个的方法。在此我们将他的所有方法体都删除掉(上面代码红

色部分删掉),完全将其重写。首先我们要创建一个图片对象,在

Android

里,

所有位图图片都是使用

Bitmap

类来封装的,

我们就先声明一个代表我们刚才图片

的一个

Bitmap

对象,可通过以下方式声明:

 

        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),

R.drawable.pic);

其中的

getResources()

方法,

是有

View

提供的,

可以根据此方法获得我们所

有的资源,将来有机会再细说!

 

 

 

 

 

 

 

       

有了

bitmap

对象,下一步就是将图片画到我们自己的

View

上了,看上

面的“

onDraw

”方法,其中的参数是“

Canvas

”对象,其实就是提供了一个画板,

有了画板我们就能画任何我们想画的东西了。

可以通过调用

canvas

的方法将图片

画到画板上:

 

        canvas.drawBitmap(bitmap, 0, 0, null);

其中的参数分别是“

Bitmap

对象,

Left

距离左边界坐标,

Top

距离上边界坐标,

Paint

对象”其中的

Paint

对象,可以做一些额外设置,比如我们要画文字到画板上,就可以通过

paint

置其大小,

颜色,

等,

也可以设置透明度

(即

Alpha

值)

画图片也可以通过

Paint

设置其

Alpha

值,在此我们不演示了,直接传一个空进去。

 

       

通过以上的方式,就可以将图片显示在屏幕上,不过当前我们要修改一

下默认

Activity

的代码,

让我们一启动就能看到我们自定义的显示图片的

View

在这里我们还是用我们

Helloworld

实例中的

Activity

HelloAndroid

)打开此

类,将方法“

public

void

onCreate(Bundle

savedInstanceState)

”中的内容改

为如下:

 

         super.onCreate(savedInstanceState);

        setContentView(new MovingPictureView(this));

即将当前显示的

View

设置为我们自定义的

View

。运行此工程,就会看到如下图

所示结果:

 

 

 

 

 

 

 

 


 

 

图片显示在左上角,现在图片是显示出来了,下一步,我们要让其自动浮动。可

以通过不停的改变图片的

Left

Top

值,再重新画图片达到此效果,如何重画图

片呢?

View

给我们提供了一个名字为

invalidate()

的方法,

只要调用此方法,

View

就会重新调用

onDraw

方法,重绘该

View

内容。另外我们创建一个线程,来

不停的变换图片的

Left

Top

值,调用

invalidate

方法重绘

View

。实现的全部

代码大致如下:

 

public class MovingPictureView extends View implements Runnable{

 

 //

用于显示的图片

 

 Bitmap bitmap;

 

 //

图片坐标转化的线程是否运行,

false

,则停止运行

 

 boolean isRuning = true;

 

 //

图片的

Lfet

Top

 

 int left = 0;

 int top = 0;

 

 

 

 

 

 

 

 //

用于同步线程

 

 Handler handler;

 

 //

向量,可以通过调节此两个变量调节移动速度

 

 int dx = 1;

 int dy = 1;

 

 public MovingPictureView(Context context) {

  super(context);

  bitmap

=

BitmapFactory.decodeResource(getResources(),

R.drawable.pic);

  handler = new Handler();

  new Thread(this).start();

 }

 

 @Override

 protected void onDraw(Canvas canvas) {

  //

将图画到画板上

 

  canvas.drawBitmap(bitmap, left,top, null);

 }

 

 @Override

 public boolean onTouchEvent(MotionEvent event) {

  isRuning = false;//

当点击屏幕,则将图片浮动停止

 

  return true;

 }

 

 @Override

 public void run() {

  while(isRuning){

   

   //

通过调节向量,来控制方向

 

   dx = left < 0 || left > (getWidth() - bitmap.getWidth()) ? -dx : dx;

   dy = top < 0 || top > (getHeight() - bitmap.getHeight()) ? -dy : dy;

   

   left = left+dx;

   top = top+dy;

   

   handler.post(new Runnable() {

    @Override

    public void run() {

     invalidate();

    }

   });

 

 

 

 

 

 

   

   try {

    Thread.sleep(10);

   } catch (InterruptedException e) {

    e.printStackTrace();

   }

  }

 }

}

其中的

handler

是用于线程同步,

因为在其他线程中,

是不允许直接访问

view

所在线程中的

view

对应资源的,如果不加

handle

,就会抛异常

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值