1, Fresco 是是Facebook开发的一个强大的图片加载组件。
和Picasso,Glide比较,它在内存管理方面有很大优势。它的图片是存储在Native层的,可避免OOM。
github地址:https://github.com/facebook/fresco.
2, 使用Fresco的步骤 :
第一步:添加依赖:
implementation 'com.facebook.fresco:fresco:1.11.0’
第二步:自定义一个Aplication 的子类 例如 DemoApplication//初始化Fresco
Fresco.initialize(this);
第三步:将DemoApplication注册到AndroidManifest.xml中。
第四步:在layout文件声明组件,使用框架中的SimpleDraweeView。
使用fresco的控件,需要在layout文件中添加上:
xmlns:fresco=“http://schemas.android.com/apk/res-auto”
注意: SimpleDraweeView的宽高不能为wrap_content,需要使用match_parent或者一个固定值。
第五步:在Activity中拿到控件。
第六步:产生图片的Uri。图片可以来自网络,asset目录,res目录,sd卡目录等。
例如:Uri uri = Uri.parse(picURL);//产生网络下的资源描述符.
产生sd卡目录下的图片资源描述符:
new Uri.Builder()
.scheme(UriUtil.LOCAL_FILE_SCHEME)
.path("/sdcard/img.jpg")
.build();
第七步:加载图片。
frescoImg.setImageURI(uriAsset);
3, Freso控件的一些默认的属性:
<com.facebook.drawee.view.SimpleDraweeView
android:layout_width=“20dp”
android:layout_height=“20dp”
fresco:fadeDuration=“300”// 淡出时间,毫秒。
fresco:actualImageScaleType=“focusCrop”// 等同于android:scaleType。
fresco:placeholderImage="@color/wait_color"// 加载中…时显示的图。
fresco:placeholderImageScaleType=“fitCenter”// 加载中…显示图的缩放模式。
fresco:failureImage="@drawable/error"// 加载失败时显示的图。
fresco:failureImageScaleType=“centerInside”// 加载失败时显示图的缩放模式。
fresco:retryImage="@drawable/retrying"// 重试时显示图。
fresco:retryImageScaleType=“centerCrop”// 重试时显示图的缩放模式。
fresco:progressBarImage="@drawable/progress_bar"// 进度条显示图。
fresco:progressBarImageScaleType=“centerInside”// 进度条时显示图的缩放模式。
fresco:progressBarAutoRotateInterval=“1000”// 进度条旋转时间间隔。
fresco:backgroundImage="@color/blue"// 背景图,不会被View遮挡。
fresco:roundAsCircle=“false”// 是否是圆形图片。
fresco:roundedCornerRadius=“1dp”// 四角圆角度数,如果是圆形图片,这个属性被忽略。
fresco:roundTopLeft=“true”// 左上角是否圆角。
fresco:roundTopRight=“false”// 右上角是否圆角。
fresco:roundBottomLeft=“false”// 左下角是否圆角。
fresco:roundBottomRight=“true”// 左下角是否圆角。
fresco:roundingBorderWidth=“2dp”// 描边的宽度。
fresco:roundingBorderColor="@color/border_color" 描边的颜色。
/>
4, Freso的使用Demo。
布局页面
<com.facebook.drawee.view.SimpleDraweeView
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:id="@+id/sdv"
fresco:placeholderImage="@mipmap/ic_launcher"
fresco:roundedCornerRadius=“20dp”
fresco:roundTopLeft=“true”
fresco:roundTopRight=“true”
fresco:roundBottomLeft=“true”
fresco:roundBottomRight=“true”
fresco:roundWithOverlayColor="@color/colorAccent"
fresco:roundingBorderWidth=“10dp”
fresco:roundingBorderColor="@color/colorPrimary"
/>
//加载图片
String imgPath = “https://img-my.csdn.net/uploads/201407/26/1406383299_1976.jpg”;
Uri uri = Uri.parse(imgPath);
mSdv.setImageURI(uri);
11 ButterKnife
地址 https://www.cnblogs.com/whoislcj/p/5620128.html
通过注解的方式 , 减少了代码中 findViewById以及setOnClickListener等代码量。
优势:
1,ButterKnife优势相比起xutils来,ButterKnife更受欢迎,在性能方面xutils完全是利用的反射,butterknife是轻量级的反射使用的注解都是编译时注解.
2,强大的View绑定和Click事件处理功能,简化代码,提升开发效率
3,方便的处理Adapter里的ViewHolder绑定问题
4,运行时不会影响APP效率,使用配置方便
代码清晰,可读性强
使用步骤:
第一步: 导入依赖
implementation ‘com.jakewharton:butterknife:8.8.1’
annotationProcessor ‘com.jakewharton:butterknife-compiler:8.8.1’
第二步: Activity的 onCreate方法中
unbinder = ButterKnife.bind(this);
onDestroy方法中
unbinder.unbind();
Fragment 在 onCreateView 中
unbinder = ButterKnife.bind(this,rootView);
onDestroy方法中
unbinder.unbind();
注意:Activity和Fragment的区别.
ButterKnife.bind()的调用在Activity中必须在setContentView之后
属性布局不能用private or static 修饰,否则会报错
第三步:使用
注解
– View的注解—
@BindView(布局页面中控件的ID)
TextView tv;
@BindViews({控件的id1,控件的id2})
List data;
—Resource注入 —
@BindBitmap(图片的id)//Bitmap注解使用
Bitmap bitmap;
@BindDrawable(图片的id)//Drawable注解使用
Drawable drawable;
//监听的使用
@OnClick(R.id.but_id)
public void onClick(View view)
{
Toast.makeText(this, “你点击了按钮”, Toast.LENGTH_SHORT).show();
}
@BindString(R.string.msg)//string注解使用
String message;
@BindArray(R.array.names)
String weeks[];//数组
@BindColor(R.color.colorPrimary)
int colorPrimary;//color注解使用
----事件的注解----
@OnClick(R.id.but_id)
public void click(){ }
可以写一个BaseActivity来调用ButterKnife.bind()方法,子类则不需要再进行bind操作
在8.4中ButterKnife移除了unBind方法,使用ButterKnife.bind(this)返回一个Unbinder的引用,通过Unbinder的unbind()方法进行解除绑定.
Demo使用的网络资源。
“https://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1”
package com.example.myapplication
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.myapplication.Bean.Bean
import com.example.myapplication.retorfitInterface.IgetbyData
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.Url
import java.net.URL
class GetActivity : AppCompatActivity() {
private var baseUrl = "http://www.qubaobei.com";
private var url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1";
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_get)
println("###进入此页面")
Log.i("###","进入此页面")
initRetorfit();
initUrl();
}
private fun initUrl() {
// Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(url)
// .build().create(IgetbyData::class.java).getData()
}
private fun initRetorfit() {
// 获取构建者
val builder = Retrofit.Builder()
// 传入baseUrl
builder.baseUrl(baseUrl)
builder.addConverterFactory(GsonConverterFactory.create())
// 获取retorfit实例
val retrofit = builder.build()
var igetbyData:IgetbyData = retrofit.create(IgetbyData::class.java)
val call = igetbyData.getData("dish_list.php", "1", "20", "1")
call.enqueue(object :Callback<Bean>{
override fun onFailure(call: Call<Bean>?, t: Throwable?) {
// 请求失败
println("###请求数据失败")
}
override fun onResponse(call: Call<Bean>?, response: Response<Bean>?) {
println("###请求后的数据"+response?.body().toString())
}
})
}
}
package com.example.myapplication
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.ListView
import butterknife.BindView
import butterknife.ButterKnife
import com.example.myapplication.Bean.Bean
import com.example.myapplication.retorfitInterface.IgetbyData
import kotlinx.android.synthetic.main.activity_butter_knife.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class ButterKnife : AppCompatActivity() {
@BindView(R.id.mylist)
var listView:ListView? = null;
var adapter = MyAdapter(this);
private var baseUrl = "http://www.qubaobei.com";
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_butter_knife)
val bind = ButterKnife.bind(this)
initView();
initRetorfit()
}
private fun initView() {
mylist.adapter = adapter;
}
private fun initRetorfit() {
val builder = Retrofit.Builder()
builder.baseUrl(baseUrl)
builder.addConverterFactory(GsonConverterFactory.create())
val retrofit = builder.build()
var igetbyData: IgetbyData = retrofit.create(IgetbyData::class.java)
val call = igetbyData.getData("dish_list.php", "1", "20", "1")
call.enqueue(object : Callback<Bean> {
override fun onFailure(call: Call<Bean>?, t: Throwable?) {
println("###请求数据失败")
}
override fun onResponse(call: Call<Bean>?, response: Response<Bean>?) {
println("###请求后的数据"+response?.body())
val bean = response?.body() as Bean
adapter.list = bean.data;
}
})
}
}