前一天学习了时钟的创建以及定时器的实现。通过DigitalClock控件和AnalogClock控件可以实现数字时钟和模拟时钟。通过Chronometer控件的启动和停止,可以实现定时器的功能。Chronometer控件监听事件的绑定是通过setOnChronometerTickListener()方法实现的。
今天将学习ImageView控件。ImageView控件派生自View,用来显示像图标之类的图片。要实现的效果如图1所示。
图1 ImageView控件效果
当点击“透明度降低”按键时,在ImageView控件中显示的图片透明度降低;当点击“透明度增加”按键时,则图片透明度增加;点击“下一个”按键时,更换图片。点击中间部分的ImageView控件时,会在下部的ImageView控件中显示其局部放大图,其显示的内容会随着触摸中间的ImageView控件的动作而改变。
1 控件的添加
在界面布局文件中添加三个Button控件和2个ImageView控件。其中三个Button按键的ID分别设置为minus、plus和next。中间位置的ImageView属性如下:
<ImageView
android:id="@+id/image_total"
android:layout_width="fill_parent"
android:layout_height="240dp"
android:background="#FFFFFF"
android:scaleType="fitCenter"
/>
其中,background属性表示背景的颜色;scaleType属性指定图像如何匹配ImageView控件,fitCenter的值是3,表示按照居中的方式显示图像。居中方式显示图像会保持图像宽度与高度的比例,并且保证全部图像在ImageView中显示,图像位于控件的*。
下部位置的ImageView属性如下:
<ImageView
android:id="@+id/image_part"
android:layout_width="120dp"
android:layout_height="120dp"
android:background="#0000FF"
android:layout_marginTop="10dp"/>
其中,layout_marginTop属性指定了控件上部距上方控件的最小距离。
2 图像切换的实现
在“基于Java语言的安卓编程之九”中提到了实现ImageView控件图像切换的方法,即为“下一个”按键添加点击事件的监控器,在重载的onClick()函数中调用ImageView控件的setImageResource()方法实现图像的切换。
ImageView控件的setImageResource()方法要读取和解码UI线程中的位图,因此会消耗一些时间导致图像显示时会有卡顿。可以使用setImageBitmap()方法实现该功能。另外,在进行图像切换的时候,需要将上一张图像的资源进行释放,避免资源的浪费。释放图像资源可以通过Bitmap类的recycle()方法实现。
2.1 释放图像资源
为“下一个”按键添加点击事件的监听器。之后在onClick中释放上一张图像资源
1 next.setOnClickListener(new OnClickListener(){
2 @Override
3 publicvoid onClick(View v)
4 {
5 BitmapDrawable bitmapDrawable =(BitmapDrawable)image_total.getDrawable();
6 if( !bitmapDrawable.getBitmap().isRecycled() )
7 {
8 bitmapDrawable.getBitmap().recycle();
9 }
10 //切换图像
11 });
其中,第5行的image_total是添加的“Image_Total”控件,通过该控件调用ImageView类的getDrawable()方法获取ImageView类显示图像对应的BitmapDrawable类的对象。BitmapDrawable类是android.graphics.drawable类的子类,表示“可以在上面画画的图像”,通过BitmapDrawable类可以获取与它相关的图像。第6行中的getBitmap()方法的作用就是获取与bitmapDrawable相关的图像,即ImageView控件中显示的图像。该方法的返回值是Bitmap类,通过该类调用Recycled()方法判断该图像是否已经被收回,如果没有被收回,则调用recycle()方法收回该图像(7-9行)。
2.2 图像的切换
在收回了上一张图像之后,接下来就要将ImageView控件中显示的图像切换到下一张了。
1 image_total.setImageBitmap(
2 BitmapFactory.decodeResource(getResources(),images[currentImg])
3 );
其中,第一行的setImageBitmap()方法不直接读取资源,因此其显示图像的速度要比setImageResource()方法要快。该方法的格式为
publicvoid setImageBitmap (Bitmap bm)
其中,参数bm即为要设置的图像。在第2行中的BitmapFactory是android.graphics包中的的类。该类可以从文件、流或者字节集合中创建位图对象。该类的decodeResource()方法的作用是通过资源ID来解码资源,其返回值为Bitmap类型。该方法的格式为:
public static Bitmap decodeResource (Resources res,int id)
其中,res指定了包含图像资源的对象;id指定了图像资源ID。在第2行中getResources()的作用是获取应用程序包的资源实例,images是之前定义的int数组,包含了要显示图像的ID,currentImg是要显示图像ID在数组中的索引。
3 图像透明度的修改
通过修改图像的Alpha值来实现图像透明度的修改。首先新建一个OnClickListener接口,之后将其作为“降低透明度”和“增加透明度”这两个按键点击事件的监听器进行添加。
3.1 OnClickListener接口的创建
1 OnClickListener listener =new OnClickListener()
2 {
3 @Override
4 publicvoid onClick(View v)
5 {
6 if( v==plus )
7 {
8 alpha += 20;
9 }
10 if( v==minus )
11 {
12 alpha -= 20;
13 }
14 if(alpha>=255 )
15 {
16 alpha = 255;
17 }
18 if(alpha<=0)
19 {
20 alpha = 0;
21 }
22 image_total.setAlpha(alpha);
23 }
24 };
其中,第1行通过new关键字创建了OnClickListener接口,从第3行开始重载了该类的onClick()方法。第6-9行的作用是判断是否按下了“降低透明度”按键,如果按下,则alpha值增加;第10-13行的作用是判断是否按下了“增加透明度”按键,如果按下,则alpha值减少。第14-21行对aipha值进行判断,如果超出0-255范围,则取边界值。第22行中调用ImageView控件的setAlpha()方法对图像的Alpha值进行设置。
3.2 按键点击事件监视器的添加
将新建的OnClickListener接口的对象作为的“降低透明度”和“增加透明度”这两个按键点击事件的监听器进行添加。
plus.setOnClickListener(listener);
minus.setOnClickListener(listener);
其中,plus是“降低透明度”按键的对象,minus是“增加透明度”按键的对象。