我们知道,进入百度图片后,输入一个关键字后,首先看到的是很多缩略图,当我们点击某张缩略图时,我们就可以进入到大图显示页面,在大图显示页面,中包含了一个图片画廊,同时当前大图为刚刚我们点击的那张图片。现在我们看看在Android中如何实现类似的效果:

首先,我们需要有一个控件来显示缩略图,这里没有什么比GridView更加合适了。

配置文件如下:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:id="@+id/view_photos"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_marginTop="10dp"

android:columnWidth="100dp"

android:numColumns="auto_fit"

android:horizontalSpacing="5dp"

android:verticalSpacing="5dp"

android:listSelector="@drawable/frame_select" />

对于GridView中每一项是一张缩略图,我们需要继承BaseAdapter,实现自己的一个GridImageAdapter,代码:

package com.liner.manager;

import java.util.List;

import com.liner.manager.adapter.GridImageAdapter;

import android.app.Activity;

import android.graphics.Bitmap;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.Gallery;

import android.widget.ImageButton;

import android.widget.AdapterView.OnItemClickListener;

public class GalleryActivity extends Activity{

private ImageButton currentImage;

private Gallery gallery;

private int[] thumbIds;

private int currentPos;

private Bitmap currentBitmap;

private List bitmapCache;

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.gallery);

currentImage = (ImageButton)this.findViewById(R.id.image_current);

gallery = (Gallery)this.findViewById(R.id.image_gallery);

gallery.setOnItemClickListener(galleryItemClickListener);

init();

}

private OnItemClickListener galleryItemClickListener = new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> p, View v, int position,

long id) {

// 点击事件

showCurrentImage(position);

}

};

private void init(){

thumbIds = this.getIntent().getIntArrayExtra("thumbIds");

currentPos = this.getIntent().getIntExtra("currentPos",0);

//galleryIds = this.getThumbnailIds(currentPos); //当前的gallery里的图片信息

bitmapCache = BitmapUtils.queryThumbnailListByIds(this, thumbIds);

GridImageAdapter adapter = new GridImageAdapter(this.getApplication(), bitmapCache);

gallery.setAdapter(adapter);

gallery.setSelection(currentPos);

showCurrentImage(currentPos);

}

private void showCurrentImage(int position){

if(currentBitmap != null){

currentBitmap.recycle();

}

currentBitmap = BitmapUtils.queryImageByThumbnailId(GalleryActivity.this, thumbIds[position]);

if(currentBitmap != null){

currentImage.setImageBitmap(currentBitmap);

}else{

//什么都不做

}

//releaseBitmaps();

}

/**

* 将Gallery当前可见的显示之前的3张,后3张缓存起来,其余的释放掉,这样是为了放置内存不够用

* 之所以前三张后三张,是为了Gallery可以滑动的更加顺畅

*/

private void releaseBitmaps(){

int start = gallery.getFirstVisiblePosition()-3; //缓存的起始位置

int end = gallery.getLastVisiblePosition()+3; //缓存的结束位置

Bitmap delBitmap;

for(int i=0; i

delBitmap = bitmapCache.get(i);

if(delBitmap != null){

bitmapCache.remove(i);

delBitmap.recycle();

}

}

for(int i=end+1; i

delBitmap = bitmapCache.get(i);

if(delBitmap != null){

bitmapCache.remove(i);

delBitmap.recycle();

}

}

}

/**

* 获取当前位置的前三个Id和后三个Id

* @param position

* @return

*/

private Integer[] getThumbnailIds(int position){

Integer[] ids = new Integer[]{0,0,0,0,0,0,0};

int currPos = 0;

//关于这里的处理,比较复杂

for(int i=3; i>0; i--){

if(position - i >= 0){

currPos = 3-i;

ids[currPos] = thumbIds[position-i];

}

}

ids[++currPos] = thumbIds[position]; //当前Id

//currGallerySelection = currPos;

//这样右边剩下的位置数就是7-currPos-1

for(int i=1; i<=6-currPos;i++){

if(position+i < thumbIds.length){

ids[currPos+i] = thumbIds[position+i];

}

}

return ids;

}

}

然后,我们就可以在Activity中通过查询MediaStore的多媒体图片库来查询所有的图片的缩略图,缩略图所在的位置是:

MediaStore.Images.Thumbnails。Activity代码如下:

package com.liner.manager;

import java.util.ArrayList;

import java.util.List;

import com.liner.manager.adapter.GridImageAdapter;

import android.app.Activity;

import android.content.Intent;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.Uri;

import android.os.Bundle;

import android.provider.MediaStore;

import android.view.View;

import android.widget.Adapter;

import android.widget.AdapterView;

import android.widget.GridView;

import android.widget.Toast;

public class MainActivity extends Activity {

private GridView photoView;

private GridImageAdapter imageAdapter;

private Cursor cursor;

private int[] thumbIds;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

photoView = (GridView)this.findViewById(R.id.view_photos);

photoView.setOnItemClickListener(photoClickListener);

//showImages();

showThumbnails();

}

private void showThumbnails(){

cursor = BitmapUtils.queryThumbnails(this);

if(cursor.moveToFirst()){

List bitmaps = new ArrayList();

thumbIds = new int[cursor.getCount()];

for(int i=0; i

cursor.moveToPosition(i);

String currPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));

thumbIds[i] = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID));

Bitmap b = BitmapUtils.decodeBitmap(currPath,100,100);

bitmaps.add(b);

}

imageAdapter = new GridImageAdapter(this.getApplication(), bitmaps);

photoView.setAdapter(imageAdapter);

}

}

private AdapterView.OnItemClickListener photoClickListener = new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> p, View v, int position,

long id) {

//点击某张缩略图时,转到图片显示界面

Intent intent = new Intent();

intent.setClass(MainActivity.this, GalleryActivity.class);

intent.putExtra("thumbIds", thumbIds);

intent.putExtra("currentPos", position);

startActivity(intent);

}

};

}

注意到,我们记录了,所有缩略图对应的id号,和当前的用户选择的位置,然后通过Intent传递到第二个展示界面。第二个界面的布局文件如下:我们用了一个Gallery和一个ImageButton来实现

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/image_gallery"

android:layout_width="fill_parent"

android:layout_height="100dp"

/>

android:id="@+id/image_current"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:padding="10dp"

android:layout_marginTop="10dp"

/>

然后,对应的Activity如下:

package com.liner.manager;

import java.util.List;

import com.liner.manager.adapter.GridImageAdapter;

import android.app.Activity;

import android.graphics.Bitmap;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.Gallery;

import android.widget.ImageButton;

import android.widget.AdapterView.OnItemClickListener;

public class GalleryActivity extends Activity{

private ImageButton currentImage;

private Gallery gallery;

private int[] thumbIds;

private int currentPos;

private Bitmap currentBitmap;

private List bitmapCache;

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.gallery);

currentImage = (ImageButton)this.findViewById(R.id.image_current);

gallery = (Gallery)this.findViewById(R.id.image_gallery);

gallery.setOnItemClickListener(galleryItemClickListener);

init();

}

private OnItemClickListener galleryItemClickListener = new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> p, View v, int position,

long id) {

// 点击事件

showCurrentImage(position);

}

};

private void init(){

thumbIds = this.getIntent().getIntArrayExtra("thumbIds");

currentPos = this.getIntent().getIntExtra("currentPos",0);

//galleryIds = this.getThumbnailIds(currentPos); //当前的gallery里的图片信息

bitmapCache = BitmapUtils.queryThumbnailListByIds(this, thumbIds);

GridImageAdapter adapter = new GridImageAdapter(this.getApplication(), bitmapCache);

gallery.setAdapter(adapter);

gallery.setSelection(currentPos);

showCurrentImage(currentPos);

}

private void showCurrentImage(int position){

if(currentBitmap != null){

currentBitmap.recycle();

}

currentBitmap = BitmapUtils.queryImageByThumbnailId(GalleryActivity.this, thumbIds[position]);

if(currentBitmap != null){

currentImage.setImageBitmap(currentBitmap);

}else{

//什么都不做

}

//releaseBitmaps();

}

}

可以看到,当用户点击Gallery中某一项时,触发onItemClick事件,在其中,我们通过根据该缩略图对应的Image_ID来从MediaStore.Images.Media中查询该缩略图对应的大图。并在ImageButton中显示。

这里当图片很多时,可能会出现内存溢出,为了避免这种情况,可以更加Gallery的特点,使用缓存。保存当前可见的缩略图的前三个到后三个。其余的全部recycle。当用户点击Gallery的时候,在判断当前的位置,如果大于或小于某个值时,则重新更新缓存。这样保证内存中的缩略图的个数总是6+Gallery.getLastVisiblePosition-Gallery.getFirstVisiblePosition个。其实这就是浮动缓存窗口,一个固定大小窗口在整个坐标(全部缩略图)上游动。这里没有实现,以后待续。

同时,你可能已经注意到,程序中使用到了一个BitmapUtils类,这个类是封装了一系列对查询图片,并将其解析为Bitmap的类。

代码如下:

package com.liner.manager;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.provider.MediaStore;

import android.util.Log;

public final class BitmapUtils {

public static Bitmap decodeBitmap(String path, int displayWidth, int displayHeight){

BitmapFactory.Options op = new BitmapFactory.Options();

op.inJustDecodeBounds = true;

Bitmap bmp = BitmapFactory.decodeFile(path, op); //获取尺寸信息

//获取比例大小

int wRatio = (int)Math.ceil(op.outWidth/(float)displayWidth);

int hRatio = (int)Math.ceil(op.outHeight/(float)displayHeight);

//如果超出指定大小,则缩小相应的比例

if(wRatio > 1 && hRatio > 1){

if(wRatio > hRatio){

op.inSampleSize = wRatio;

}else{

op.inSampleSize = hRatio;

}

}

op.inJustDecodeBounds = false;

bmp = BitmapFactory.decodeFile(path, op);

return Bitmap.createScaledBitmap(bmp, displayWidth, displayHeight, true);

}

/**

* 采用复杂计算来决定缩放

* @param path

* @param maxImageSize

* @return

*/

public static Bitmap decodeBitmap(String path, int maxImageSize){

BitmapFactory.Options op = new BitmapFactory.Options();

op.inJustDecodeBounds = true;

Bitmap bmp = BitmapFactory.decodeFile(path, op); //获取尺寸信息

int scale = 1;

if(op.outWidth > maxImageSize || op.outHeight > maxImageSize){

scale = (int)Math.pow(2, (int)Math.round(Math.log(maxImageSize/(double)Math.max(op.outWidth, op.outHeight))/Math.log(0.5)));

}

op.inJustDecodeBounds = false;

op.inSampleSize = scale;

bmp = BitmapFactory.decodeFile(path, op);

return bmp;

}

public static Cursor queryThumbnails(Activity context){

String[] columns = new String[]{

MediaStore.Images.Thumbnails.DATA,

MediaStore.Images.Thumbnails._ID,

MediaStore.Images.Thumbnails.IMAGE_ID

};

return context.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, columns, null, null, MediaStore.Images.Thumbnails.DEFAULT_SORT_ORDER);

}

public static Cursor queryThumbnails(Activity context, String selection, String[] selectionArgs){

String[] columns = new String[]{

MediaStore.Images.Thumbnails.DATA,

MediaStore.Images.Thumbnails._ID,

MediaStore.Images.Thumbnails.IMAGE_ID

};

return context.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, MediaStore.Images.Thumbnails.DEFAULT_SORT_ORDER);

}

public static Bitmap queryThumbnailById(Activity context, int thumbId){

String selection = MediaStore.Images.Thumbnails._ID + " = ?";

String[] selectionArgs = new String[]{

thumbId+""

};

Cursor cursor = BitmapUtils.queryThumbnails(context,selection,selectionArgs);

if(cursor.moveToFirst()){

String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));

cursor.close();

return BitmapUtils.decodeBitmap(path, 100, 100);

}else{

cursor.close();

return null;

}

}

public static Bitmap[] queryThumbnailsByIds(Activity context, Integer[] thumbIds){

Bitmap[] bitmaps = new Bitmap[thumbIds.length];

for(int i=0; i

bitmaps[i] = BitmapUtils.queryThumbnailById(context, thumbIds[i]);

}

return bitmaps;

}

/**

* 获取全部

* @param context

* @return

*/

public static List queryThumbnailList(Activity context){

List bitmaps = new ArrayList();

Cursor cursor = BitmapUtils.queryThumbnails(context);

for(int i=0; i

cursor.moveToPosition(i);

String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));

Bitmap b = BitmapUtils.decodeBitmap(path, 100, 100);

bitmaps.add(b);

}

cursor.close();

return bitmaps;

}

public static List queryThumbnailListByIds(Activity context, int[] thumbIds){

List bitmaps = new ArrayList();

for(int i=0; i

Bitmap b = BitmapUtils.queryThumbnailById(context, thumbIds[i]);

bitmaps.add(b);

}

return bitmaps;

}

public static Cursor queryImages(Activity context){

String[] columns = new String[]{

MediaStore.Images.Media._ID,

MediaStore.Images.Media.DATA,

MediaStore.Images.Media.DISPLAY_NAME

};

return context.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);

}

public static Cursor queryImages(Activity context, String selection, String[] selectionArgs){

String[] columns = new String[]{

MediaStore.Images.Media._ID,

MediaStore.Images.Media.DATA,

MediaStore.Images.Media.DISPLAY_NAME

};

return context.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, MediaStore.Images.Media.DEFAULT_SORT_ORDER);

}

public static Bitmap queryImageById(Activity context, int imageId){

String selection = MediaStore.Images.Media._ID + "=?";

String[] selectionArgs = new String[]{

imageId + ""

};

Cursor cursor = BitmapUtils.queryImages(context, selection, selectionArgs);

if(cursor.moveToFirst()){

String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));

cursor.close();

//return BitmapUtils.decodeBitmap(path, 260, 260);

return BitmapUtils.decodeBitmap(path, 220); //看看和上面这种方式的差别,看了,差不多

}else{

cursor.close();

return null;

}

}

/**

* 根据缩略图的Id获取对应的大图

* @param context

* @param thumbId

* @return

*/

public static Bitmap queryImageByThumbnailId(Activity context, Integer thumbId){

String selection = MediaStore.Images.Thumbnails._ID + " = ?";

String[] selectionArgs = new String[]{

thumbId+""

};

Cursor cursor = BitmapUtils.queryThumbnails(context, selection, selectionArgs);

if(cursor.moveToFirst()){

int imageId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID));

cursor.close();

return BitmapUtils.queryImageById(context, imageId);

}else{

cursor.close();

return null;

}

}

}

这样就实现了,类似百度图片浏览的效果。效果图如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android 图片查看功能吗,Android仿百度图片查看功能相关推荐

  1. 仿百度文库html5源码,JS实现仿百度文库评分功能

    百度文库分享平台大家都知道,今天小编通过一段实例代码给大家介绍基于js实现百度文库评分功能,先给大家展示效果图吧. 具体代码如下所示: 无标题文档 *{padding:0;margin:0;} #co ...

  2. 实现仿百度图片查看功能(点击缩略图放大效果)

    我们知道,进入百度图片后,输入一个关键字后,首先看到的是很多缩略图,当我们点击某张缩略图时,我们就可以进入到大图显示页面,在 大图显示页面,中包含了一个图片画廊,同时当前大图为刚刚我们点击的那张图片. ...

  3. Android LruCache和DiskLruCache相结合打造图片加载框架(仿微信图片选择,照片墙)

    LrcCache和DiskLruCache相结合打造图片加载框架 转载请标明出处:http://blog.csdn.net/luoshishou/article/details/51299169 源码 ...

  4. Android自定义下拉刷新动画--仿百度外卖下拉刷新

    好久没写博客了,小编之前一段时间一直在找工作,从天津来到了我们的大帝都,感觉还不错.好了废话不多说了,开始我们今天的主题吧.现如今的APP各式各样,同样也带来了各种需求,一个下拉刷新都能玩出花样了,前 ...

  5. android 中间凹背景_Android开发仿百度地图的凹陷BottomNavigationView

    释放双眼,带上耳机,听听看~! 百度的: 71529789c6c948803e1075c2c7e00809.jpg 我的: e9347423eb2031228af77ad63d7b01d7.jpg 使 ...

  6. 防仿百度图片背景色php,基于jQuery实现仿百度首页换肤背景图片切换代码_jquery...

    不多说了,先给大家展示效果图,本文支持源码下载哦,需要的朋友可以直接下载使用,代码很简单哦- html代码: css代码: *{margin:0;padding:0} a{color:#fff; ma ...

  7. html如何设置跳转到百度页面,js仿百度切换皮肤功能(html+css)

    js仿百度切换皮肤效果:(换肤出来一个div,选择你想要的图片,作为网页背景,保存) 要点:cookie保存状态 html代码: 换肤 热门 收起 css代码: * { margin:0px; pad ...

  8. html自动播放的照片查看器,(转)htmlayout仿Picasa照片查看器效果

    import win.ui; /*DSG{{*/ var winform = win.form( text = "仿Picasa照片查看器效果";exmode="tool ...

  9. python爬去百度图片_爬虫篇| 爬取百度图片(一)

    什么是爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模 ...

最新文章

  1. 台积电2nm与3nm制程
  2. 【linux】Valgrind工具集详解(十四):Cachegrind(缓存和分支预测分析器)
  3. ARM学习书单一提供打包下载地址
  4. Spring框架学习笔记(2)——IOCDI
  5. 打印容器_3D打印:增材点阵结构在压力容器优化设计中的应用
  6. Flutter Container 容器以及对齐方式 Alignment
  7. Reactive(3)5分钟理解 SpringBoot 响应式的核心-Reactor
  8. avue-crud 使用_创建和使用CRUD存储过程
  9. C++ 中的深入浅拷贝和深拷贝
  10. 交换机名词解释、配置常用命令
  11. 使用maven打包bootdo并运行
  12. 红外测距GY20A21
  13. pdf英文转换成html网页,Pdf转HTML转换工具
  14. Emulex光纤卡lpfc配置文件的修改
  15. 一起来学习网站SEO优化工作流程到底怎么做?
  16. c# m4a文件转mp3文件 【.net】
  17. OSG路径漫游实现与应用
  18. 《数字图像处理》冈萨雷斯,Matlab函数汇总 .
  19. php中的 notice,PHP中出现Notice: Undefined index的三种解决办法
  20. 润了!大龄码农从北京到荷兰的躺平生活

热门文章

  1. 论文笔记《基于EWA的股权分置改革对价均衡研究》
  2. 【无人机】基于Fast行军树(FMT)求解无人机故障路径规划问题附matlab代码和论文
  3. 使用pyecharts包作简单的中国地图
  4. linux 安装 qq
  5. 180张超漂亮QQ头像打包下载
  6. 积分商城游戏设置的基本要点
  7. 国内、外 浏览器内核
  8. python深度神经网络_从Lasagne获取输出(Python深度神经网络框架)
  9. 抖音自媒体运营主要做什么?影响推荐量的因素有哪些?
  10. React Native 指定模拟器手机型号 --simulator