android学习笔记(21)图像视固(Image View )的功能和用法

2014-12-13 10:29:42     13 人阅读    

Image View继承自View组件,它的主要功能是用于显示图片-实际上这个说法不太严 谨,因为它能显示的不仅仅是图片,任何Drawable对象都可使用ImageView来显示。
表2.12显示了 TextView支持的常用XML属性及相关方法的说明。
表2.12 ImageView支持的XML属性及相关方法的说明
XML属性                                      相关方法                                             说 明
android:adjustViewBounds          setAdjustViewBounds(boolean)         设置ImageView是否调整自己的边界来保持所M示图片 的长宽比
android:maxHeight                     setMaxHeight(int)                             设置ImageView的最人高度
android: max Width                   setMaxWidth(int)                              设置 Image View的域人宽度
android iscaleType                    setScaleTVpeOmageView.ScaleTVpe)     设置显示的图片如何缩放或移动以适应丨mage View的大小
android :src                             setI mageResource( i nt)                      设置ImageView所显示的Drawable对象的ID

表2.12所支持的android:scaleType属性可指定如下属性值。
matrix (ImageView.ScaleType.MATRIX):使用 matrix 方式进行缩放。
fitXY (lmageView.ScaleType.FIT_XY):对图片横向、纵向独立缩放,使得该图 片完全适应于该ImageView,图片的纵横比可能会改变。
fitStart (lmageView.ScaleType.FIT_START):保持纵横比缩放图片,直到该图片 能完全显示在ImageView中(图片较长的边长与ImageView相应的边长相等), 缩放完成后将该图片放在ImageView的左上角。
fitCenter (lmageView.ScaleType.FIT_CENTER):保持纵横比缩放图片,直到该 图片能完全显示在ImageView中(图片较长的边长与ImageView相应的边长相等), 缩放完成后将该图片放在ImageView的中央。
fitEnd (lmageView.ScaleType.FIT_END):保持纵横比缩放图片,直到该图片能 完全显示在ImageView中(图片较长的边长与ImageView相应的边长相等),缩 放完成后将该图片放在ImageView的右下角。
 center (ImageView.ScaleType.CENTER):把图片放在ImageView 的中间,但 不进行任何缩放。
centerCrop (lmageView.ScaleType.CENTER_CROP):保持纵横比缩放图片,
以使得图片能完全覆盖ImageView。
centerlnside (ImageView.ScaleType.CENTERINSIDE):保持纵横比缩放图片, 以使得ImageView能完全显示该图片。
ImageView的功能比较简单,下面结合一个图片浏览器的实例来示范ImageView的功能 和用法。

实例:图片浏览器
本例的图片浏览器可以改变所査看图片的透明度,可通过调用ImageView的setAlpha方 法来实现。不仅如此,本图片浏览器还可通过一个小区域来查看图片的原始大小,因此本例 会定义两个ImageView, —个用于查看图片整体,一个用于査看图片局部的细节。
下面是本例的界面布局文件。
程序清单:res\layout\main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" 
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
<LinearLayout
 android:orientation="horizontal" 
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:gravity="center">
<Button android:id="@+id/plus"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="增大透明度"
 />
<Button android:id="@+id/minus"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="降低透明度"
 />
<Button android:id="@+id/next"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="下一张"
 />  
</LinearLayout>
<!-- 定义显示图片整体的ImageView -->
<ImageView android:id="@+id/image1"
 android:layout_width="fill_parent"
 android:background="#0000ff" 
 android:layout_height="240px"
 android:src="@drawable/shuangta"
 android:scaleType="fitCenter"  />
<!-- 定义显示图片局部细节的ImageView --> 
<ImageView android:id="@+id/image2" 
 android:layout_width="120dp"
 android:layout_height="120dp"
 android:background="#0000ff"  
 android:layout_marginTop="10dp"/>
</LinearLayout>

上面的界面布局中定义了两个ImageView,其中第一个ImageView指定了 android:scale Type=”fuCenter”,这表明ImageView显示图片时会进行保持纵横比的缩放,并将缩放后的图 片放在该ImageView的中央。
为了能动态改变图片的透明度,接下来需要为按钮编写事件监听器,当用户单击按钮时, 动态改变图片的Alpha值。为了能动态显示图片的局部细节,程序为第一个ImageView添加 OnTouchListener监听器,用户在第一个ImageView上发生触摸事件时,程序从原始图片中读 取相应部分的图片,并将其显示在第二个1。下面是主程序的代码。
程序清单:\src\org\crazyit\imageview\ImageViewTest.java

package org.crazyit.imageview;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;


public class ImageViewTest extends Activity
{
 //定义一个访问图片的数组
 int[] images = new int[]{
  R.drawable.lijiang,
  R.drawable.qiao,
  R.drawable.shuangta,
  R.drawable.shui,
  R.drawable.xiangbi,
 };
 //定义默认显示的图片
 int currentImg = 2;
 //定义图片的初始透明度
 private int alpha = 255;
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  final Button plus = (Button)findViewById(R.id.plus);
  final Button minus = (Button)findViewById(R.id.minus);
  final ImageView image1 = (ImageView)findViewById(R.id.image1);
  final ImageView image2 = (ImageView)findViewById(R.id.image2);
  final Button next = (Button)findViewById(R.id.next);
  //定义查看下一张图片的监听器
  next.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    if (currentImg >= 4)
    {
     currentImg = -1;
    }
    BitmapDrawable bitmapDrawable = (BitmapDrawable) image1
     .getDrawable();
    //如果图片还未回收,先强制回收该图片
    if (!bitmapDrawable.getBitmap().isRecycled())
    {
     bitmapDrawable.getBitmap().recycle();
    }
    //改变ImageView显示的图片
    image1.setImageBitmap(BitmapFactory.decodeResource(getResources()
     , images[++currentImg]));
//    try
//    {
//     //改变ImageView里显示的图片
//     image1.setImageResource(images[++currentImg]);
//    }
//    //捕捉内存溢出异常
//    catch(OutOfMemoryError e)
//    {
//    }
   }
  });
  //定义改变图片透明度的方法
  OnClickListener listener = new OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    if(v == plus)
    {
     alpha += 20;
    }
    if(v == minus)
    {
     alpha -= 20;
    }
    if(alpha >= 255)
    {
     alpha = 255;
    }
    if(alpha <= 0)
    {
     alpha = 0;
    }
    //改变图片的透明度
    image1.setAlpha(alpha);    
   }
  };
  //为两个按钮添加监听器
  plus.setOnClickListener(listener);
  minus.setOnClickListener(listener);
  image1.setOnTouchListener(new OnTouchListener()
  {
   @Override
   public boolean onTouch(View view, MotionEvent event)
   {
    BitmapDrawable bitmapDrawable = (BitmapDrawable) image1.getDrawable();
    //获取第一个图片显示框中的位图
    Bitmap bitmap = bitmapDrawable.getBitmap();
    //bitmap图片实际大小与第一个ImageView的缩放比例
    double scale = bitmap.getWidth() / 320.0;
    //获取需要显示的图片的开始点
    int x = (int) (event.getX() * scale);
    int y = (int) (event.getY() * scale);
    if (x  + 120 > bitmap.getWidth())
    {
     x = bitmap.getWidth() - 120;
    }
    if (y  + 120 > bitmap.getHeight())
    {
     y = bitmap.getHeight() - 120;
    }
    //显示图片的指定区域
    image2.setImageBitmap(Bitmap.createBitmap(bitmap, x, y, 120, 120));
    image2.setAlpha(alpha);
    return false;
   }
  });
 }
}


上面的程序中第一行粗体字代码会动态设置第一个ImageView的Alpha值,这就是动态 改变该图片的透明度了 :程序第二行、第三行粗体字代码用于显示图片的指定部分一此时 用到了 Bitmap类,它是一个代表位图的类,调用它的createBitmapO静态方法即可截取位图 的指定部分——该方法返回截取区域生成的新位图。
上面程序中①号代码处指定了如果第一个ImageView所显示的位图还没被回收,程序将 主动调用Bitmap对象的recycle()方法进行回收——这样可以保证程序不会抛出一个OOM (OutOfMemory)错误。


原文地址:http://www.itmmd.com/201412/308.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

android学习笔记(22)android AutoCompleteTextView 自动完成文本框(AutoCompleteTextView )的功能和用法的功能和用法   上一篇
下一篇  node.js依赖的 JavaScript基础 继承 和异常处理

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!