Android实现图片点击放大
本文实例为大家分享了Android实现图片点击放大的具体代码,供大家参考,具体内容如下
在我的项目中,有点击图片banner后放大浏览的功能。我的做法就是创建一个专门的图片显示Activity,布局里面用ViewPage,这样就能控制图片的左右滑动,并且控制首先显示第几张图片。
功能是ok的,显示也是正常的。但我花费了好几天的时间来实现、完善这个功能。
ShowMoreImageActivity
/**
*图片放大
*/
publicclassShowMoreImageActivityextendsBaseActivity{
@FindId(R.id.vp)
privateViewPagervp;
@FindId(R.id.ll_point)
privateLinearLayoutll_point;
privateListimgs;
@FindId(R.id.btn_save)
privateImageViewbtn_save;
privateintindex;
publicstaticinttype;
privateActivityactivity;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_more_image);
initViews();
activity=this;
}
privatevoidinitViews(){
AutoFindId.findId(context);
imgs=(ArrayList)getIntent().getSerializableExtra("img");
index=getIntent().getIntExtra("index",0);
type=getIntent().getIntExtra("type",0);
vp.setAdapter(newMoreImgPagerAdapter(context,imgs));
vp.addOnPageChangeListener(newOnPageChangeListener(){
@Override
publicvoidonPageSelected(intarg0){
index=arg0;
setUpPoint(imgs.size(),arg0);
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageScrollStateChanged(intarg0){
}
});
setUpPoint(imgs.size(),0);
vp.setCurrentItem(index);
}
protectedvoiddownLoad(finalStringurls){
String[]split=urls.split("\\?");
finalStringurl=split[0];
if(url.startsWith("file")){
G.toast(context,"此为本地图片,不用下载,路径为"+url.replace("file://",""));
return;
}
if(OKHttpUtils.isNetworkAvailable(context)){
G.showPd(context);
TDUtils.execute(newRunnable(){
@Override
publicvoidrun(){
try{
Filefile=newFile(C.getDownloadPath());
if(!file.exists()){
file.mkdir();
}
Filejpg=newFile(C.getDownloadPath()+G.urlToFileName(url));
//如果已经存在则不需要下载
if(jpg!=null&&jpg.exists()){
G.dismissProgressDialogInThread();
G.toastInThread(context,
"该文件已被下载到"+jpg.getParent()+context.getResources().getString(R.string.xia));
return;
}
//先从缓存中查找
FiletmpFile=NetAide.getBitmapUtils().getBitmapFileFromDiskCache(url);
if(tmpFile!=null&&tmpFile.exists()){
G.look("---从缓存中查找到图片----");
Bitmapbm=BitmapFactory.decodeFile(tmpFile.getAbsolutePath());
FileOutputStreamfos=newFileOutputStream(jpg);
bm.compress(CompressFormat.JPEG,100,fos);
fos.close();
G.dismissProgressDialogInThread();
//通知图库更新
C.noticeImageRefresh(context,jpg);
G.toastInThread(context,context.getResources().getString(R.string.downLoadUrl)
+jpg.getParent()+context.getResources().getString(R.string.xia));
return;
}
//从网络上下载保存
Bitmapbm=BitmapFactory.decodeStream(newURL(url).openStream());
FileOutputStreamfos=newFileOutputStream(jpg);
bm.compress(CompressFormat.JPEG,100,fos);
fos.close();
G.dismissProgressDialogInThread();
//通知图库更新
C.noticeImageRefresh(context,jpg);
G.toastInThread(context,"你现在可以在图库中查看该图片了");
}catch(Exceptione){
e.printStackTrace();
G.dismissProgressDialogInThread();
G.toastInThread(context,context.getResources().getString(R.string.downLoadFail));
Filejpg=newFile(C.getDownloadPath()+G.urlToFileName(url));
if(jpg!=null&&jpg.exists()){
jpg.delete();
}
}
}
});
}
}
privatevoidsetUpPoint(intsize,intchoose){
ll_point.removeAllViews();
if(size<=1){
return;
}
for(inti=0;i
对应布局:
MoreImgPagerAdapter
publicclassMoreImgPagerAdapterextendsPagerAdapter{
privateContextcontext;
privateListimages;
privateSparseArray>ivs;
publicMoreImgPagerAdapter(Contextcontext,Listimages){
this.context=context;
this.images=images;
ivs=newSparseArray>();
}
@Override
publicintgetCount(){
returnimages.size();
}
@Override
publicvoiddestroyItem(ViewGrouparg0,intarg1,Objectarg2){
SoftReferencereference=ivs.get(arg1);
if(reference!=null&&reference.get()!=null){
arg0.removeView(reference.get());
}
}
@Override
publicObjectinstantiateItem(ViewGrouparg0,finalintarg1){
SoftReferencereference=ivs.get(arg1);
if(reference==null||reference.get()==null){
Viewv=LayoutInflater.from(context).inflate(R.layout.item_show_more_image,null);
reference=newSoftReference(v);
ivs.put(arg1,reference);
}
Viewv=reference.get();
finalViewHolderholder=newViewHolder(v);
Glide.with(context).asBitmap().load(images.get(arg1)).into(holder.image);
arg0.addView(v);
returnv;
}
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0.equals(arg1);
}
classViewHolder{
@FindId(R.id.image)
privateImageViewimage;
@FindId(R.id.rl_percent)
privateRelativeLayoutrl_percent;
@FindId(R.id.tv_percent)
privateTextViewtv_percent;
@FindId(R.id.iv_top)
privateImageViewiv_top;
publicViewHolder(Viewv){
AutoFindId.findIdByView(this,v);
}
}
}
对应布局:
上面都是次要的,因为我发现了一个更为简便的轮子。
github地址
在我的项目中,我只需要两步就完成了此功能。
第一步:
//查看大图
implementation'com.github.SherlockGougou:BigImageViewPager:v4_6.1.1'
第二步:
在点击图片事件那里调用:
ImagePreview
.getInstance()
//上下文,必须是activity,不需要担心内存泄漏,本框架已经处理好;
.setContext(context)
//设置从第几张开始看(索引从0开始)
.setIndex(position)
//有三种设置数据集合的方式,根据自己的需求进行三选一:
//1:第一步生成的imageInfoList
//.setImageInfoList(imageInfoList)
//2:直接传urlList
.setImageList(imageList)
//3:只有一张图片的情况,可以直接传入这张图片的url
//.setImage(Stringimage)
//开启预览
.start();
就这样完成了图片放大浏览、下载的功能,在这里记录下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。