Android将Glide动态加载不同大小的图片切圆角与圆形的方法

Android将Glide动态加载不同大小的图片切圆角与圆形的方法,第1张

概述Glide加载动态图片首先我们先要去依赖一个githup:bumptech:glide:glide:3.7.0包;使用Glide结合列表的样式进行图片加载:

GlIDe加载动态图片

首先我们先要去依赖一个githup:bumptech:glIDe:glIDe:3.7.0包;

使用GlIDe结合列表的样式进行图片加载:

1) 如果使用的是ListVIEw,可以直接在Adapter的getVIEw方法中使用:

@OverrIDe public VIEw getVIEw(int position,VIEw convertVIEw,VIEwGroup parent) { if (null == convertVIEw) {  //..... } GlIDe  .with(context)  .load(imageUrls[position])  .into(holder.imageVIEw); return convertVIEw; }

2)    如果使用的是RecyclerVIEw,可以在Adapter的onBindVIEwHolder方法中使用:       

@OverrIDe public voID onBindVIEwHolder(RVVIEwHolder holder,int position) {  GlIDe.with(MainActivity.this)   .load(args[position])   .into(holder.imageVIEw); }

3)    当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法:

GlIDe .with(context) .load(UsageExampleListVIEwAdapter.eatFoodyImages[0]) .placeholder(R.mipmap.ic_launcher) // can also be a drawable .into(imageVIEwPlaceholder);

4) 当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示:

GlIDe .with(context) .load("http://futurestud.io/non_existing_image.png") .error(R.mipmap.future_studio_launcher) // will be displayed if the image cannot be loaded .into(imageVIEwError);

5)    图片的缩放,centerCrop()和fitCenter():       

//使用centerCrop是利用图片图填充ImageVIEw设置的大小,如果ImageVIEw的//Height是match_parent则图片就会被拉伸填充GlIDe.with(MainActivity.this)   .load(args[position])   .centerCrop()   .into(holder.imageVIEw);//使用fitCenter即缩放图像让图像都测量出来等于或小于 ImageVIEw 的边界范围//该图像将会完全显示,但可能不会填满整个 ImageVIEw。GlIDe.with(MainActivity.this)   .load(args[position])   .fitCenter()   .into(holder.imageVIEw);

6)    显示gif动画:

GlIDe  .with( context ) .load( gifUrl ) .asgif() //判断加载的url资源是否为gif格式的资源 .error( R.drawable.full_cake ) .into( imageVIEwGif );

7)    显示本地视频

String filePath = "/storage/emulated/0/Pictures/example_vIDeo.mp4";GlIDe  .with( context ) .load( Uri.fromfile( new file( filePath ) ) ) .into( imageVIEwGifAsBitmap );

8)    缓存策略:

GlIDe  .with( context ) .load( Images[0] ) .skipMemoryCache( true ) //跳过内存缓存 .into( imageVIEwInternet );GlIDe  .with( context ) .load( images[0] ) .diskCacheStrategy( diskCacheStrategy.NONE ) //跳过硬盘缓存 .into( imageVIEwInternet );
diskCacheStrategy.NONE 什么都不缓存 diskCacheStrategy.soURCE 仅仅只缓存原来的全分辨率的图像 diskCacheStrategy.RESulT 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的) diskCacheStrategy.ALL 缓存所有版本的图像(默认行为)

9)    优先级,设置图片加载的顺序:

Priority.LOWPriority.norMALPriority.HIGHPriority.IMMEDIATE private voID loadImageWithHighPriority() {  GlIDe .with( context ) .load( mages[0] ) .priority( Priority.HIGH ) .into( imageVIEwHero );}private voID loadImagesWithLowPriority() {  GlIDe .with( context ) .load( images[1] ) .priority( Priority.LOW ) .into( imageVIEwLowPrioleft ); GlIDe .with( context ) .load( images[2] ) .priority( Priority.LOW ) .into( imageVIEwLowPrioRight );}

10)    当不需要将加载的资源直接放入到ImageVIEw中而是想获取资源的Bitmap对象:

//括号中的300,600代表宽和高但是未有作用SimpleTarget target = new SimpleTarget<Bitmap>(300,600) {  @OverrIDe  public voID onResourceReady(Bitmap resource,GlIDeAnimation<? super Bitmap> glIDeAnimation) {   holder.imageVIEw.setimageBitmap(resource);  }  };  GlIDe.with(MainActivity.this)   .load(args[position])   .asBitmap()   .into(target);

11)    集成网络栈(okhttp,Volley): 

dependencIEs {  // your other dependencIEs // ... // GlIDe compile 'com.github.bumptech.glIDe:glIDe:3.6.1' // GlIDe's Okhttp Integration  compile 'com.github.bumptech.glIDe:okhttp-integration:1.3.1@aar' compile 'com.squareup.okhttp:okhttp:2.5.0'}dependencIEs {  // your other dependencIEs // ... // GlIDe compile 'com.github.bumptech.glIDe:glIDe:3.6.1' // GlIDe's Volley Integration  compile 'com.github.bumptech.glIDe:volley-integration:1.3.1@aar' compile 'com.mcxiaoke.volley:library:1.0.8'}

好了,以上就是GlIDe动态加载图片的方法,下面开始本文的正文:

需求

GlIDe下载图片并切圆角或圆形,但图片有大有小,图片不能改变,切圆还好说,但是切圆角就会发现图片小的会比图片大的要圆
搜一下 " GlIDe动态加载圆形图片跟圆角图片 " 就会出现很多文章,但这些都不能解决上面的问题 怎样能 GlIDe动态加载不同大小的图片切圆形图片跟圆角图片呢?

解决很简单

既然是图片大小不一致而导致图片切出来不一样,那就把图片变的一样大小不就可以吗

申明一下我的代码也是在GlIDe动态加载圆形图片跟圆角图片搜出来的代码基础上修改的. 下面就是代码了.

build.gradle

apply plugin: 'com.androID.application'androID { compileSdkVersion 26 buildToolsversion "26.0.2" defaultConfig { applicationID "cn.xm.weIDongjian.glIDedemo" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionname "1.0" } buildTypes { release {  MinifyEnabled false  proguardfiles getDefaultProguardfile('proguard-androID.txt'),'proguard-rules.pro' } deBUG {  MinifyEnabled true  proguardfiles getDefaultProguardfile('proguard-androID.txt'),'proguard-rules.pro' } }}dependencIEs { compile filetree(dir: 'libs',include: ['*.jar']) compile 'com.androID.support:appcompat-v7:26.1.0' compile 'com.github.bumptech.glIDe:glIDe:3.6.1'}

activity_main.xml

<relativeLayout   xmlns:androID="http://schemas.androID.com/apk/res/androID"  xmlns:tools="http://schemas.androID.com/tools"  androID:layout_wIDth="match_parent"  androID:layout_height="match_parent"  androID:paddingleft="@dimen/activity_horizontal_margin"  androID:paddingRight="@dimen/activity_horizontal_margin"  androID:paddingtop="@dimen/activity_vertical_margin"  androID:paddingBottom="@dimen/activity_vertical_margin"  tools:context=".MainActivity"> <button androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="正常图片" androID:ID="@+ID/button" androID:layout_alignParenttop="true" androID:layout_centerHorizontal="true"/> <ImageVIEw androID:layout_wIDth="72dp" androID:layout_height="72dp" androID:ID="@+ID/imageVIEw" androID:scaleType="fitCenter" androID:layout_below="@+ID/button" androID:layout_alignRight="@+ID/button" androID:layout_alignEnd="@+ID/button" androID:layout_margintop="150dp"/> <ImageVIEw androID:layout_wIDth="72dp" androID:layout_height="72dp" androID:ID="@+ID/imageVIEw2" androID:scaleType="fitCenter" androID:layout_below="@+ID/imageVIEw" androID:layout_alignRight="@+ID/imageVIEw" androID:layout_alignEnd="@+ID/imageVIEw" androID:layout_margintop="5dp" /> <button androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="圆角图片" androID:ID="@+ID/button2" androID:layout_below="@+ID/button" androID:layout_alignleft="@+ID/button" androID:layout_alignRight="@+ID/imageVIEw" androID:layout_alignEnd="@+ID/imageVIEw"/> <button androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="大圆角图片" androID:ID="@+ID/button3" androID:layout_below="@+ID/button2" androID:layout_alignleft="@+ID/button2" androID:layout_alignStart="@+ID/button2"/> <button androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="圆形图片" androID:ID="@+ID/button4" androID:layout_below="@+ID/button3" androID:layout_alignleft="@+ID/button" androID:layout_alignRight="@+ID/button3" androID:layout_alignEnd="@+ID/button3"/></relativeLayout>

MainActivity

package cn.xm.weIDongjian.glIDedemo;import androID.content.Context;import androID.os.Bundle;import androID.support.v7.app.AppCompatActivity;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OnClickListener;import androID.Widget.ImageVIEw;import com.bumptech.glIDe.GlIDe;import com.bumptech.glIDe.RequestManager;public class MainActivity extends AppCompatActivity implements OnClickListener { private ImageVIEw imageVIEw; private RequestManager glIDeRequest; private Context context = this; private ImageVIEw imageVIEw2; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); init(); } private voID init() { findVIEwByID(R.ID.button).setonClickListener(this); findVIEwByID(R.ID.button2).setonClickListener(this); findVIEwByID(R.ID.button3).setonClickListener(this); findVIEwByID(R.ID.button4).setonClickListener(this); imageVIEw = (ImageVIEw) findVIEwByID(R.ID.imageVIEw); imageVIEw2 = (ImageVIEw) findVIEwByID(R.ID.imageVIEw2); glIDeRequest = GlIDe.with(this); } @OverrIDe public voID onClick(VIEw v) { switch (v.getID()) {  case R.ID.button:  glIDeRequest.load("http://androIDop.le890.com/hma/upload/2016/10/11/1704146358.png").into(imageVIEw);  glIDeRequest.load("http://androIDop.le890.com/hma/upload/2016/10/11/1716089900.png").into(imageVIEw2);  break;  case R.ID.button2:  glIDeRequest.load("http://androIDop.le890.com/hma/upload/2016/10/11/1704146358.png").transform(new GlIDeRoundtransform(context)).into(imageVIEw);  glIDeRequest.load("http://androIDop.le890.com/hma/upload/2016/10/11/1716089900.png").transform(new GlIDeRoundtransform(context)).into(imageVIEw2);  break;  case R.ID.button3:  glIDeRequest.load("http://androIDop.le890.com/hma/upload/2016/10/11/1704146358.png").transform(new GlIDeRoundtransform(context,7)).into(imageVIEw);  glIDeRequest.load("http://androIDop.le890.com/hma/upload/2016/10/11/1716089900.png").transform(new GlIDeRoundtransform(context,7)).into(imageVIEw2);  break;  case R.ID.button4:  glIDeRequest.load("http://androIDop.le890.com/hma/upload/2016/10/11/1704146358.png").transform(new GlIDeCircletransform(context)).into(imageVIEw);  glIDeRequest.load("http://androIDop.le890.com/hma/upload/2016/10/11/1716089900.png").transform(new GlIDeCircletransform(context)).into(imageVIEw2);  break; } }}

GlIDeCircletransform

package cn.xm.weIDongjian.glIDedemo;import androID.content.Context;import androID.graphics.Bitmap;import androID.graphics.BitmapShader;import androID.graphics.Canvas;import androID.graphics.Paint;import com.bumptech.glIDe.load.engine.bitmap_recycle.BitmapPool;import com.bumptech.glIDe.load.resource.bitmap.Bitmaptransformation;public class GlIDeCircletransform extends Bitmaptransformation { public GlIDeCircletransform(Context context) { super(context); } @OverrIDe protected Bitmap transform(BitmapPool pool,Bitmap totransform,int outWIDth,int outHeight) { return circleCrop(pool,totransform); } private static Bitmap circleCrop(BitmapPool pool,Bitmap source) { if (source == null) return null; int size = Math.min(source.getWIDth(),source.getHeight()); int x = (source.getWIDth() - size) / 2; int y = (source.getHeight() - size) / 2; // Todo this Could be acquired from the pool too Bitmap squared = Bitmap.createBitmap(source,x,y,size,size); Bitmap result = pool.get(size,Bitmap.Config.ARGB_8888); if (result == null) {  result = Bitmap.createBitmap(size,Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(squared,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r,r,paint); return result; } @OverrIDe public String getID() { return getClass().getname(); }}

GlIDeRoundtransform

package cn.xm.weIDongjian.glIDedemo;import androID.content.Context;import androID.content.res.Resources;import androID.graphics.Bitmap;import androID.graphics.BitmapShader;import androID.graphics.Canvas;import androID.graphics.Matrix;import androID.graphics.Paint;import androID.graphics.RectF;import androID.util.Log;import com.bumptech.glIDe.load.engine.bitmap_recycle.BitmapPool;import com.bumptech.glIDe.load.resource.bitmap.Bitmaptransformation;public class GlIDeRoundtransform extends Bitmaptransformation { private static float radius = 0f; public GlIDeRoundtransform(Context context) { this(context,4); } public GlIDeRoundtransform(Context context,int dp) { super(context); this.radius = Resources.getSystem().getdisplayMetrics().density * dp; } @OverrIDe protected Bitmap transform(BitmapPool pool,int outHeight) { return roundCrop(pool,totransform); } private static Bitmap roundCrop(BitmapPool pool,Bitmap source) { if (source == null) return null; Bitmap bitmap = changeBitmapSize(source); Bitmap result = pool.get(bitmap.getWIDth(),bitmap.getHeight(),Bitmap.Config.ARGB_4444); if (result == null) {  int wIDth = bitmap.getWIDth();  int height = bitmap.getHeight();  result = Bitmap.createBitmap(wIDth,height,Bitmap.Config.ARGB_4444); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(bitmap,BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); RectF rectF = new RectF(0f,0f,bitmap.getWIDth(),bitmap.getHeight()); canvas.drawRoundRect(rectF,radius,paint); return result; } public static Bitmap changeBitmapSize(Bitmap bitmap) { int wIDth = bitmap.getWIDth(); int height = bitmap.getHeight(); //设置想要的大小 int newWIDth=72; int newHeight=72; //计算压缩的比率 float scaleWIDth=((float)newWIDth)/wIDth; float scaleHeight=((float)newHeight)/height; //获取想要缩放的matrix Matrix matrix = new Matrix(); matrix.postscale(scaleWIDth,scaleHeight); //获取新的bitmap bitmap=Bitmap.createBitmap(bitmap,wIDth,matrix,true); bitmap.getWIDth(); bitmap.getHeight(); Log.e("newWIDth","newWIDth"+bitmap.getWIDth()); Log.e("newHeight","newHeight"+bitmap.getHeight()); return bitmap; } @OverrIDe public String getID() { return getClass().getname() + Math.round(radius); }}

很简单吧,就是用changeBitmapSize方法把图片压缩到72*72的这样图片都一样大了,在切就不会出现切出来的图片效果不一样了

最后代码(dome)

github地址: https://github.com/liang9/Imagedome

本地下载地址:http://xiazai.jb51.net/201711/yuanma/Imagedome(jb51.net).rar

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

总结

以上是内存溢出为你收集整理的Android将Glide动态加载不同大小的图片切圆角与圆形的方法全部内容,希望文章能够帮你解决Android将Glide动态加载不同大小的图片切圆角与圆形的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1143777.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存