xUtils分为四个模块:注解模块,网络模块,图片加载模块,数据库模块。
xUtils3相对于旧版本xUtils具有如下变化:
HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略.
支持标准的Cookie策略, 区分domain, path…
事件注解去除不常用的功能, 提高性能.
数据库api简化提高性能, 达到和greenDao一致的性能.
图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转…
今天学习了xUtils3注解模块和图片加载模块。
一、添加依赖
下载xUtils模块(https://github.com/wyouflf/xUtils3)并添加依赖:
compile project(path: ':xutils')
在自己应用的Application中初始化xUtils参数:
x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG);
二、注解模块
在Activity的oncreate方法里面加上下面的代码:
x.view().inject(this);
对父布局和相关控件添加注解:
@ContentView(R.layout.activity_main)
public class MainActivity extends Activity {
@ViewInject(R.id.img)
private ImageView img;
ImageOptions m_imageOptions;
@ViewInject(R.id.txt)
private TextView txt;
@ViewInject(R.id.btn)
Button btn;
处理控件的响应事件
@Event(value = {R.id.btn1,R.id.btn2},type = View.OnClickListener.class
//type = View.OnLongClickListener.class
)
private void btnClick(View view){
switch (view.getId()){
case R.id.btn1:
Toast.makeText(getActivity(),"btn1",Toast.LENGTH_LONG).show();
break;
case R.id.btn2:
Toast.makeText(getActivity(),"btn2",Toast.LENGTH_LONG).show();
break;
}
}
其中箭头所指部分既可以单独展开处理也可以利用数组(如上图)合并处理。type属性为可选项,默认值View.OnClickListener.class.如果你想实现其余点击事件效果,只需要把type值进行修改即可。
在fragment中使用注解模块需要区别于activity的是activity中是在oncreate方法里面加上下面的代码:
x.view().inject(this);
对应的fragment则是在onCreateView和onViewCreated方法中进行绑定
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
injected=true;
return x.view().inject(this,inflater,container);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!injected) x.view().inject(this,getView());
}
三、图片加载模块
支持本地、在线、assets图片的显示,方法如下:
void bind(ImageView view, String url);
void bind(ImageView view, String url, ImageOptions options);
void bind(ImageView view, String url, Callback.CommonCallback<Drawable> callback);
void bind(ImageView view, String url, ImageOptions options, Callback.CommonCallback<Drawable> callback);
Callback.Cancelable loadDrawable(String url, ImageOptions options, Callback.CommonCallback<Drawable> callback);
Callback.Cancelable loadFile(String url, ImageOptions options, Callback.CacheCallback<File> callback);
void clearMemCache();
void clearCacheFiles();
可以利用ImageOptions类配置图片显示参数
示例如下:
x.image().bind(img, "http://f.hiphotos.baidu.com/zhidao/pic/item/2fdda3cc7cd98d104cc21595203fb80e7bec907b.jpg");
x.image().bind(img, "http://preview.quanjing.com/mf063/mf866-03580453.jpg", m_imageOptions, new Callback.CommonCallback<Drawable>() {
@Override
public void onSuccess(Drawable result) {
mHandler.sendEmptyMessage(11);
Log.d("MainActivity", "onSuccess() ");
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
mHandler.sendMessage(mHandler.obtainMessage(12));
Log.d("MainActivity", "onError() ");
}
@Override
public void onCancelled(CancelledException cex) {
Log.d("MainActivity", "onCancelled() ");
}
@Override
public void onFinished() {
mHandler.sendMessage(mHandler.obtainMessage(13, 1, 3));
Log.d("MainActivity", "onFinished() ");
}
});
x.image().bind(img, "/data/data/car.jpg",m_imageOptions);
x.image().bind(img, "assets://8.jpg",m_imageOptions);
m_imageOptions = new ImageOptions.Builder()
.setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120))
.setRadius(DensityUtil.dip2px(5))
.setCrop(true)
.setImageScaleType(ImageView.ScaleType.CENTER_CROP)
.setLoadingDrawableId(R.mipmap.ic_launcher)
.setFailureDrawableId(R.mipmap.ic_launcher)
.build();
中间有个小插曲:我在百度上随机搜了一张图片,并复制了网址(http://image.so.com/zv?ch=car&src=home_car#ch=car&src=home_car&groupid=685006f6b7fbff0967b9de48ca5642c6&itemindex=0&dataindex=174)然后去试验,结果没显示,问了wyouflf才知道这个是一个html页面,图片的实际地址是在http://preview.quanjing.com/mf063/mf866-03580453.jpg,多谢wyouflf的指点,不胜感谢。
还可以设置一个可以取消网络请求图片的加载方式,不如限时加载,没加载完成则取消
Callback.Cancelable cancelable=x.image().loadDrawable("http://f.hiphotos.baidu.com/zhidao/pic/item/2fdda3cc7cd98d104cc21595203fb80e7bec907b.jpg", null, new Callback.CommonCallback<Drawable>() {
@Override
public void onSuccess(Drawable result) {
img2.setImageDrawable(result);
txtState.setText("onSuccess");
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
txtState.setText("onError");
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
//cancelable.cancel();
对了,别忘记了添加访问网络和sd卡的权限额
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>