android imageview布局问题

happy_8 发布于 2012/08/06 15:18
阅读 50K+
收藏 3

第一种情况:图片属性设置为红色字体部分的图如下

imageview宽高属性设置为fill_parent的图

布局文件如下

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" 

    android:id="@+id/line"

    >

 

    <ImageView

        android:id="@+id/imageView"

      android:layout_width="fill_parent"

       android:layout_height="fill_parent"

        />

  <Button

        android:id="@+id/button1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="下一个" />

    </LinearLayout>

第二种情况,布局界面图如下

imageview属性为wrap_content的效果图

三张分别为同一布局文件,但图片位置大小不一样

布局文件

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" 

    android:id="@+id/line"

    >

 

    <ImageView

        android:id="@+id/imageView"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

       

       

        />

 

 

    <Button

        android:id="@+id/button1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="下一个" />

    

</LinearLayout>

第三中固定高度的布局效果图

布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:id="@+id/line"
    >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="400dp"
       
       
        />


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="下一个" />
    
</LinearLayout>

主代码程序
package com.bitmap;


import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class BitmapTest extends Activity {
	private LinearLayout  line;
	private ImageView  imageView;
	private Button button1;
	Bitmap  bmp1,bmp2,bmp3,bmp4,bmp5;
	private int i=0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button1=(Button)findViewById(R.id.button1);
        line=(LinearLayout)findViewById(R.id.line);
        imageView=(ImageView)findViewById(R.id.imageView);
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeFile("/sdcard/picturetest/a1.jpg", opts);

        opts.inSampleSize = computeSampleSize(opts, -1, 480*800);
        opts.inJustDecodeBounds = false;
        try {
        	 bmp1 = BitmapFactory.decodeFile("/sdcard/picturetest/a1.jpg", opts);
             bmp2 = BitmapFactory.decodeFile("/sdcard/picturetest/a2.jpg", opts);
        	 bmp3 = BitmapFactory.decodeFile("/sdcard/picturetest/a3.jpg", opts);
             bmp4 = BitmapFactory.decodeFile("/sdcard/picturetest/a4.jpg", opts);
        	 bmp5 = BitmapFactory.decodeFile("/sdcard/picturetest/a5.jpg", opts);
        	imageView.setImageBitmap(bmp1);
            } catch (OutOfMemoryError err) {
        }
       
        
            button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				if(i==0){
				imageView.setImageBitmap(bmp2);
				if(!bmp1.isRecycled() ){
		            bmp1.recycle() ;  //回收图片所占的内存
		            java.lang.System.gc();  //提醒系统及时回收
		            }
				}
				
				if(i==1){
					imageView.setImageBitmap(bmp3);
					
				}
				if(i==2){
					imageView.setImageBitmap(bmp4);
					if(!bmp3.isRecycled() ){
			            bmp3.recycle() ;  //回收图片所占的内存
			            java.lang.System.gc();  //提醒系统及时回收
			            }	
				}
				if(i==3){
					imageView.setImageBitmap(bmp5);
					if(!bmp4.isRecycled() ){
			            bmp4.recycle() ;  //回收图片所占的内存
			          //  java.lang.System.gc();  //提醒系统及时回收
			            }	
				}
				i++;
				
			}
        	
        	
        	
        	
        });

       
        
        
    }
    
   

	public static int computeSampleSize(BitmapFactory.Options options,
            int minSideLength, int maxNumOfPixels) {
        int initialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels);

        int roundedSize;
        if (initialSize <= 8 ) {
            roundedSize = 1;
            while (roundedSize < initialSize) {
                roundedSize <<= 1;
            }
        } else {
            roundedSize = (initialSize + 7) / 8 * 8;
        }

        return roundedSize;
    }

    private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) {
        double w = options.outWidth;
        double h = options.outHeight;

        int lowerBound = (maxNumOfPixels == -1) ? 1 :
                (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
        int upperBound = (minSideLength == -1) ? 128 :
                (int) Math.min(Math.floor(w / minSideLength),
                Math.floor(h / minSideLength));
        if (upperBound < lowerBound) {
            return lowerBound;
        }

        if ((maxNumOfPixels == -1) &&
                (minSideLength == -1)) {
            return 1;
        } else if (minSideLength == -1) {
            return lowerBound;
        } else {
            return upperBound;
        }
        
         
    }  
    
    
}

问题一:第一种情况图片为什么没有填充整个屏幕?
问题二:如何才能使第二种情况的图片大小一致呢?
问题三:第三种情况的图片上边缘为什么没有紧挨屏幕的上边缘?
恳求大家帮忙解答疑惑,谢谢!

加载中
0
迷途d书童
迷途d书童
给ImageView添加android:scaleType属性,该属性是用来控制图片如何 resized/moved来匹对ImageView的size的,即 ImageView.setScaleType(ImageView.ScaleType)。

ImageView.ScaleType / android:scaleType 值的意义区别:
CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop  按比例扩大图片的size居中显示,使得图片长 (宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside  将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示
FIT_END / fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_START / fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_XY / fitXY  把图片 不按比例 扩大/缩小到View的大小显示
MATRIX / matrix 用矩阵来绘制
0
happy_8
happy_8
非常感谢,我按照你的说的试一下
0
happy_8
happy_8

引用来自“迷途d书童”的答案

给ImageView添加android:scaleType属性,该属性是用来控制图片如何 resized/moved来匹对ImageView的size的,即 ImageView.setScaleType(ImageView.ScaleType)。

ImageView.ScaleType / android:scaleType 值的意义区别:
CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop  按比例扩大图片的size居中显示,使得图片长 (宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside  将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示
FIT_END / fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_START / fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_XY / fitXY  把图片 不按比例 扩大/缩小到View的大小显示
MATRIX / matrix 用矩阵来绘制
非常谢谢,按照你的方法,这几个问题都解决了,另外我想再问下就是像上面的程序,如果有很多张图片怎么控制显示?这个问题想了很久,一直没想出来,不知道有没有方法解决?
王二龙
回复 @j67065 : 何不试试SoftReference 软引用 用数组存之,另外 ,如果大图超过bitmap内存限制、可考虑将图片分割、还可以考虑使用webview作为显示容器
happy_8
happy_8
回复 @迷途d书童 : 这个想法不错,应该可以实现,先谢谢!
迷途d书童
迷途d书童
回复 @j67065 : 遍历指定sd卡上的图片目录,把数据存在本地sqlite数据库里,需要使用时读数据库找出图片路径,再生成bitmap加载。
happy_8
happy_8
回复 @迷途d书童 : 图片有1000多张,我把它放在sdcard上,上面的例子只是有几种图片,有四个bitmap,每次只能取路径得到一张图片,如此的话,要取1000多次路径,得到1000多个bitmap,然后用数组存储bitmap,这样显然不实际,不知道有没有比较好的方法?
happy_8
happy_8
图片有1000多张,这个用数组的话,也会比较麻烦,另外图片也比较大,放到sdcard上比较好,这样又怎么实现读取所有的图片信息呢? 如果一张一张的图,这样显然不实际
下一页
0
a
aizhunimei

在RelativeLayout中添加子View,然后移动这个添加的子View,

按下Home键之后,Activity并没有因为内存不足而被Destory

然后重新启动这个Activity,发现后边添加的子View又回到原来的位置去了,

请问各位大神,怎么破?

返回顶部
顶部