可以实现设置图片显示的时候,依据本身的比例进行图片的缩放
加载图片效果:首先将ImageLoader的jar包关联到项目中
这里加载的是网络图片,所以要添加访问网络的权限
这里加载图片使用的控件是自定义的一个控件
自定义 imageVIEwimport androID.content.Context;import androID.util.AttributeSet;import androID.Widget.ImageVIEw;/** * 自定义的加载图片的ImageVIEw * 功能:能够根据一个指定的宽高比(ratio)和自己的宽度,动态设置自己的高度 * @author administrator * */public class RatioImageVIEw extends ImageVIEw{ //宽高比 private float ratio = 0f; public RatioImageVIEw(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } //主要设置自定义属性的 *** 作 public RatioImageVIEw(Context context, AttributeSet attrs) { super(context, attrs); //获取自定义属性的值,赋值ratio //参数一是用来设定自定义控件的加载位置 ratio = attrs.getAttributefloatValue("http://schemas.androID.com/apk/res/<span >com.example.test</span><span >"</span> , "ratio", 0f); } public RatioImageVIEw(Context context) { super(context); } /** * 设置ImageVIEw的宽高比 * @param ratio */ public voID setRatio(float ratio){ this.ratio = ratio; } /** * onMeasure是measure方法引起的回调,而measure方法是父VIEw在测量子VIEw会调用子的VIEw的measure方法 * 所以wIDthMeasureSpec和heightmeasureSpec是父VIEw在调用子VIEw的measure方法时计算好的 * MeasureSpec: 测量规则,由size和mode2个因素组成: * size: 就是指定的大小值 * mode: MeasureSpec.AT_MOST : 对应的是warp_content; * MeasureSpec.EXACTLY : 对应的是具体的dp值,match_parent * MeasureSpec.UnspecIFIED: 未定义的,一般用adapter的vIEw的测量中 */ @OverrIDe protected voID onMeasure(int wIDthMeasureSpec, int heightmeasureSpec) { //从wIDthMeasureSpec中反向获取父VIEw计算好的size int wIDth = MeasureSpec.getSize(wIDthMeasureSpec); //根据宽高比和wIDth,计算出对应的height if(ratio!=0){ float height = wIDth/ratio; //重新组建heightmeasureSpec,传递给super.onMeasure heightmeasureSpec = MeasureSpec.makeMeasureSpec((int) height,MeasureSpec.EXACTLY); } super.onMeasure(wIDthMeasureSpec, heightmeasureSpec); }}
配制自定义属性 values/attrs.xml中
<!-- 声明RatioImageVIEw的属性 --> <declare-styleable name="RatioImageVIEw"> <attr name="ratio" format="float"></attr> </declare-styleable>
在布局文件中的使用:
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:Googleplay="http://schemas.androID.com/apk/res/com.example.test" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:orIEntation="vertical" > <linearLayout androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_marginleft="8dp" androID:padding="6dp" androID:layout_marginRight="8dp" androID:background="@drawable/selector_List_item" androID:orIEntation="vertical"> <com.example.test.RatioImageVIEw androID:layout_wIDth="match_parent" androID:ID="@+ID/iv_image" androID:scaleType="fitXY" Googleplay:ratio="2.42" androID:layout_height="180dp"/><!-- <ImageVIEw androID:layout_wIDth="match_parent" androID:ID="@+ID/iv_image" androID:scaleType="fitXY" androID:layout_height="180dp"/> --> <TextVIEw androID:layout_wIDth="match_parent" androID:singleline="true" androID:layout_margintop="6dp" androID:ID="@+ID/tv_des" androID:textSize="16sp" androID:textcolor="#000000" androID:text="人之初,性本善,你掏钱,我吃饭" androID:layout_height="wrap_content"/> </linearLayout></linearLayout>
在java代码中 首先初始化Imagloader的相关设置
public class App extends Application{ @OverrIDe public voID onCreate() { super.onCreate(); //初始化imageLoader initimageLoader(this); } public static voID initimageLoader(Context context) { // This configuration tuning is custom. You can tune every option, you may tune some of them, // or you can create default configuration by// ImageLoaderConfiguration.createDefault(this); // method. ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context); config.threadPriority(Thread.norM_PRIORITY - 2); //不会在内存中缓存多个大小的图片 config.denyCacheImageMultipleSizesInMemory(); //为了保证图片名称唯一 config.diskCachefilenameGenerator(new Md5filenameGenerator()); config.diskCacheSize(50 * 1024 * 1024); // 50 MiB //内存缓存大小默认是:app可用内存的1/8 config.tasksProcessingOrder(QueueProcessingType.liFO); config.writeDeBUGLogs(); // Remove for release app // Initialize ImageLoader with configuration. ImageLoader.getInstance().init(config.build());// ImageLoader.getInstance().init( ImageLoaderConfiguration.createDefault(this)); }}
public interface ImageLoaderOptions { displayImageOptions options = new displayImageOptions.Builder() // 加载图片过程中显示哪张图片 .showImageOnLoading(R.drawable.ic_launcher) // url为空的话显示哪张图片 .showImageForEmptyUri(R.drawable.ic_launcher) // 加载图片失败显示哪张图片 .showImageOnFail(R.drawable.ic_launcher) // 在内存中缓存该图片 .cacheInMemory(true) // 在硬盘中缓存该图片 .cacheOndisk(true) //将会对图片进一步缩放,缩放的程度参考ImageVIEw的宽高 .imageScaleType(ImageScaleType.EXACTLY) //该种渲染模式也是比较节省内存的 .bitmapConfig(Bitmap.Config.RGB_565) // 会识别图片的方向信息 .consIDerExifParams(true) // .displayer(new FadeInBitmapdisplayer(800)).build();//渐渐显示的动画效果 .displayer(new RoundedBitmapdisplayer(28)).build();// 圆角的效果 //显示大图的options displayImageOptions pager_options = new displayImageOptions.Builder() // 加载图片过程中显示哪张图片 .showImageOnLoading(R.drawable.ic_launcher) // url为空的话显示哪张图片 .showImageForEmptyUri(R.drawable.ic_launcher) // 加载图片失败显示哪张图片 .showImageOnFail(R.drawable.ic_launcher) // 不在内存中缓存该图片,加载大图时候,如果使用,会造成内存溢出 .cacheInMemory(false) // 在硬盘中缓存该图片 .cacheOndisk(true) //将会对图片进一步缩放,缩放的程度参考ImageVIEw的宽高 .imageScaleType(ImageScaleType.EXACTLY) //该种渲染模式也是比较节省内存的 .bitmapConfig(Bitmap.Config.RGB_565) // 会识别图片的方向信息 .consIDerExifParams(true) //渐渐显示的动画效果 .displayer(new FadeInBitmapdisplayer(800)).build();// .displayer(new RoundedBitmapdisplayer(28)).build();// 圆角的效果}
其次 在MainActivity中
public class MainActivity extends Activity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); //显示数据的ListVIEw ListVIEw ListVIEw = (ListVIEw) findVIEwByID(R.ID.ListvIEw); //初始化数据 ArrayList<String> List = new ArrayList<String>(); for (int i = 0; i < 50; i++) { List.add("http://d.3987.com/ftlz_131026/001.jpg"); } //创建adapter SubjectAdapter subjectAdapter = new SubjectAdapter(List, this); //ListVIEw中设置Adapter ListVIEw.setAdapter(subjectAdapter); }
在SubjectAdapter中
public class SubjectAdapter extends BaseAdapter{ private ArrayList<String> maArrayList; private Context mContext; public SubjectAdapter(ArrayList<String> List,Context context) { this.maArrayList = List; this.mContext = context; } @OverrIDe public VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) { if(convertVIEw==null){ convertVIEw = VIEw.inflate(mContext, R.layout.adapter_subject, null); } VIEwHolder holder = VIEwHolder.getHolder(convertVIEw); String imageUrl = maArrayList.get(position); holder.tv_des.setText("正在测试"); ImageLoader.getInstance().displayImage(imageUrl, holder.iv_image, ImageLoaderOptions.pager_options); return convertVIEw; } static class VIEwHolder{ RatioImageVIEw iv_image; TextVIEw tv_des; public VIEwHolder(VIEw convertVIEw){ iv_image = (RatioImageVIEw) convertVIEw.findVIEwByID(R.ID.iv_image); tv_des = (TextVIEw) convertVIEw.findVIEwByID(R.ID.tv_des); } public static VIEwHolder getHolder(VIEw convertVIEw){ VIEwHolder holder = (VIEwHolder) convertVIEw.getTag(); if(holder==null){ holder = new VIEwHolder(convertVIEw); convertVIEw.setTag(holder); } return holder; } } @OverrIDe public int getCount() { return maArrayList.size(); } @OverrIDe public Object getItem(int arg0) { return null; } @OverrIDe public long getItemID(int position) { return 0; }}
最后activity_main.xml
<linearLayout 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:orIEntation="vertical" androID:background="#50666666" tools:context=".MainActivity" > <ListVIEw androID:cachecolorHint="#00000000" androID:divIDer="#00000000" androID:divIDerHeight="0dp" androID:fadingEdge="none" androID:fastScrollEnabled="false" androID:footerdivIDersEnabled="false" androID:headerdivIDersEnabled="false" androID:smoothScrollbar="true" androID:ID="@+ID/ListvIEw" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"></ListVIEw></linearLayout>
总结
以上是内存溢出为你收集整理的Android 自定义ImageView加载图片全部内容,希望文章能够帮你解决Android 自定义ImageView加载图片所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)