我们做
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
,就会抛异常