基于Java语言的安卓编程之十三ImageView控件(上)

时间:2021-08-25 00:47:44

前一天学习了时钟的创建以及定时器的实现。通过DigitalClock控件和AnalogClock控件可以实现数字时钟和模拟时钟。通过Chronometer控件的启动和停止,可以实现定时器的功能。Chronometer控件监听事件的绑定是通过setOnChronometerTickListener()方法实现的。

今天将学习ImageView控件。ImageView控件派生自View,用来显示像图标之类的图片。要实现的效果如图1所示。

基于Java语言的安卓编程之十三ImageView控件(上)

图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是“增加透明度”按键的对象。