您的位置:首页 > 其它

[置顶] 简述如何嵌套使用Viewpager,点击图片放大查看图片,并且使用PhotoView进行图片处理

2016-09-20 10:02 806 查看
我们对于ViewPager都不陌生,我们可以用它来实现图片的轮播等功能,今天我把图片的轮播加上了点击图片查看图片,并且使用PhotoView放大缩小图片避免图片失贞等功能。

首先我们导入PhotoView的jar包;;

1.我们在主布局中很简单就是一个viewpager控件;;

<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="400dp"
android:layout_height="400dp">
<span style="white-space:pre">	</span>

2.找三张图片放在assets文件中(assets自己创建,也可快捷创建:右击项目--new--Folder--Assets Folder即可创建)
3.写了三个类,首先是MainActivity类,存放图片资源代码如下:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到viewpager控件
viewPager = (ViewPager) findViewById(R.id.viewpager);

try {
//实例集合
list=new ArrayList<View>();
//我存放的三张图片的name,得到一个流
InputStream a = getAssets().open("a.jpg");
InputStream b = getAssets().open("b.jpg");
InputStream c = getAssets().open("c.jpg");
//转化成bitmap
bitmapa = BitmapFactory.decodeStream(a);
bitmapb = BitmapFactory.decodeStream(b);
bitmapc = BitmapFactory.decodeStream(c);

} catch (IOException e) {
e.printStackTrace();
}
//new 三个Imageview 分别设置图片
ImageView ima = new ImageView(MainActivity.this);
ima.setImageBitmap(bitmapa);
ImageView imb = new ImageView(MainActivity.this);
imb.setImageBitmap(bitmapb);
ImageView imc = new ImageView(MainActivity.this);
imc.setImageBitmap(bitmapc);
//添加到list集合中
list.add(ima);
list.add(imb);
list.add(imc);
//设置适配器
MyAdapter adapter = new MyAdapter(getApplicationContext(), list);
viewPager.setAdapter(adapter);
//设置一个标志,可以左右滑动
viewPager.setCurrentItem(Integer.MAX_VALUE / 2);

}
下面是Adapter类:
public class MyAdapter extends PagerAdapter {
private Context context;
private ArrayList<View> list = new ArrayList<View>();

public My
ae52
Adapter(Context context, ArrayList<View> list) {
this.context = context;
this.list = list;
}

@Override
public int getCount() {
return Integer.MAX_VALUE;
}

@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}

@Override
public Object instantiateItem(ViewGroup container, final int position) {
//获取父容器,判断是否为空,这里不能直接使用container,因为有可能并没有这个控件,所以我们直接用它的子控件获取父容器
//不为空的话就移除
if (list.get(position % list.size()).getParent() != null) {
((ViewPager) (list.get(position % list.size()).getParent())).removeView(list.get(position % list.size()));
}
//下面是两种判断方法,看点击的是那张图片,用哪一种都可以
// if (position%list.size()==0||position%list.size()==1||position%list.size()==2){
// list.get(position % list.size()).setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
// Intent intent =new Intent(context,PotosViewText.class);
// if (position % list.size()==0){
// intent.putExtra("name","a.jpg");
// }else if (position % list.size()==1){
// intent.putExtra("name","b.jpg");
// }
// else {
// intent.putExtra("name", "c.jpg");
// }
// //加一个标志,在适配器里跳转需要加标志
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//在适配器中启动意图,需要用context去启动
// context.startActivity(intent);
// }
// });
// }
final Intent intent = new Intent(context, PotosViewText.class);
switch (position % list.size()) {
case 0:
list.get(0).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
intent.putExtra("name", "a.jpg");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

}
});
break;
case 1:
list.get(1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
intent.putExtra("name", "b.jpg");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

}
});
break;
case 2:
list.get(2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
intent.putExtra("name", "c.jpg");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

}

});
break;
}
//添加视图
container.addView(list.get(position % list.size()));
return list.get(position % list.size());
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {

}
}下面是工具类:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.potos_dmeo);

imageView = (ImageView) findViewById(R.id.imgeview);
Intent intent = getIntent();
if (intent == null) {
return;
}
//拿到字符串
String name = intent.getStringExtra("name");
try {
//得到这个流
open = getAssets().open(name);
//转换成bitmap
bitmap = BitmapFactory.decodeStream(open);
} catch (IOException e) {
e.printStackTrace();
}
//imageView.setImageBitmap(bitmap);
PhotoViewAttacher attacher = new PhotoViewAttacher(imageView);
dispPhotos(bitmap,open);
}
//下面是一个方法。通过PhotosView进行了图片处理
private void dispPhotos(Bitmap bt,InputStream is) {
bt = BitmapFactory.decodeStream(is);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
float Imagewidth = bitmap.getWidth();
float Imageheight = bitmap.getHeight();
WindowManager manager = getWindowManager();
Display display = manager.getDefaultDisplay();
float displaywidth = display.getWidth();
//拿到一个缩放比
float v = displaywidth / Imagewidth;
if (v == 0) {
v = 1;
}
float v1 = Imageheight * v;
LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams((int) displaywidth, (int) v1);
imageView.setLayoutParams(layout);
imageView.setImageBitmap(bt);

}

}
这样就完成了简单的viewpager轮播图片点击进行图片的查看以及使用photosview进行图片处理避免失贞,上面代码中都有详细注释,不懂得可以下面留言我会回复,不喜勿喷~~~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐