android之HorizontalScrollView

自从android 4.1后,谷歌放弃了gallery这一控件,可以从android studio 上就可以知道gallery被划上了一道横线,显然它已经不能作为画廊使用了。Gallery每次切换图片时都会新建视图,这显然太浪费资源。那么有什么能替代Gallery呢?不用说也知道肯定有东西来代替它的,那就是HorizontalScrollView。

首先什么是HorizontalScrollView?

HorizontalScrollView是一和Framelayout,这就意味着它的下面只能放一个子控件。但是这个子控件本身也可以是一个layout,子控件中可以包括很多展示数据的控件。

下面将介绍如何用HorizontalScrollView实现gallery

首先,要引入如下文件:

import android.view.ViewGroup.LayoutParams;
import android.graphics.BitmapFactory;
import android.view.Gravity;
import android.graphics.Bitmap;
import android.widget.ImageView;
import android.view.View;

然后在activity_my.xml文件中写入如下代码:

<HorizontalScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/horizontalScrollView1"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:scrollbars="none"

        android:fillViewport="true" >

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/myGallery"></LinearLayout>
    </HorizontalScrollView>
上述代码也可以通过拖曳控件实现

然后在MyActivity.java中:

<pre name="code" class="java"> LinearLayout myGallery;
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        myGallery=(LinearLayout)findViewById(R.id.myGallery);
        String ExternalStorageDirectoryPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        String photosPath = ExternalStorageDirectoryPath+"/test";
        File photosFile=new File(photosPath);
        if(!photosFile.exists()){
            photosFile.mkdirs();
            text1.setText(photosPath+"文件已经创建");
        }else{

            text1.setText(photosPath+"文件已经存在");
        }
        for(File photoFile : photosFile.listFiles()){
            myGallery.addView(getImageView(photoFile.getAbsolutePath()));
        }
    }


 上述代码,创建或读取手机中文件夹,然后读取图片信息到getImageView。返回一个View对象,再通过addView添加到HorizontalScrollView中。 

下面的代码实现getImageView:

private View getImageView(String absolutePath){
        Bitmap bitmap=decodeBitmapFromFile(absolutePath,300,400);
        LinearLayout layout = new LinearLayout(getApplicationContext());
        layout.setLayoutParams(new LayoutParams(500,600));
        layout.setGravity(Gravity.CENTER);
        ImageView imageView=new ImageView(this);
        imageView.setLayoutParams(new LayoutParams(500,600));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setImageBitmap(bitmap);
        layout.addView(imageView);
        return layout;
    }
    private Bitmap decodeBitmapFromFile(String absolutePath,int reqWidth,int reqHeight){
        Bitmap bm=null;
        final BitmapFactory.Options options =new BitmapFactory.Options();
        options. inJustDecodeBounds = true ; //设置为true可以避免申请内存
        BitmapFactory. decodeFile(absolutePath, options);
        options. inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);//如果decode的时候把inSampleSize   设置为4,那么得到的最终图片的大小大约为512x384
        options. inJustDecodeBounds = false ;
        bm = BitmapFactory. decodeFile(absolutePath, options);
        return bm;
    }
    private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight){
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float)height / (float)reqHeight);
            } else {
                inSampleSize = Math.round((float)width / (float)reqWidth);
            }
        }

        return inSampleSize;
    }

关于上述代码的功能可以参考:

Bitmap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值