自从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;
}
关于上述代码的功能可以参考: