Android 自定义ImageView加载图片

Android 自定义ImageView加载图片,第1张

概述自定义imageview功能:可以实现设置图片显示的时候,依据本身的比例进行图片的缩放加载图片效果:使用ImageLoader来加载图片:首先将ImageLoader的jar包关联到项目中这里加载的是网络图片,所以要添加访问网络的权限这里加载图片使用的控件是自定义的一个控件自定义 自定义imagevIEw功能:

可以实现设置图片显示的时候,依据本身的比例进行图片的缩放

加载图片效果:


使用ImageLoader来加载 图片:

首先将ImageLoader的jar包关联到项目中

这里加载的是网络图片,所以要添加访问网络的权限

这里加载图片使用的控件是自定义的一个控件

自定义 imageVIEw

import 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加载图片所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/999581.html

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

发表评论

登录后才能评论

评论列表(0条)

保存