最近想搞一个图谱app出来,主要记录各个知识点,流行的框架的使用,这篇文章也是为了以做笔记形式写的
暂时打算分为下面几个部分:
四大组件
UI
Net
DynamicLoad
Cache
Database
Framework
JNI
AIDL
优秀轮子
待补充
下面开始细分
四大组件
Activity
Service
Content Provider
BroadCast Receiver
UI
ImageView
BitmapConfig类:可以解码图片,将resource解码成bitmap对象
AlPHA_8
ARGB_4444(过时,弃用)
ARGB_8888(有透明度)
size几乎是RGB_565的两倍
RGB_565(无透明度)
BitmapCompressFormate:定义bitmap以文件存储的压缩格式
PNG(无损压缩,有透明度)
JPEG(有损压缩,无透明度)
WEBP(有损,谷歌推荐代替JPEG的,压缩率为它的三分之二,主要用于网络等)
Bitmap
构造方法是被native层调用的,只能通过Bitmapfactory的decodeXXXX方法获得一个bitmap对象
大图加载
下面是对较大图片进行加载的通用做法,先获取到image的size大小,通过,injustdecodebounds来只获取边界大小信息
再decodefile,获得options参数
最后获得到的width和height来进行图片的
缩放
(注意:由于解析加载本地图片时间不确定,特别时间比较多时候,容易造成ANR,建议开线程处理)
public static Bitmap decodeSampledBitmapFromFile(String filename,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filename, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filename, options);
}
BitmapRegionDecoder
加载巨型图片,还要保证他的size的话,可以使用谷歌提供的类
使用也是非常的简单,获取到图片流或者location,定义要显示的区域位置
如下
mImageView = (ImageView) findViewById(R.id.id_imageview);
try
{
InputStream inputStream = getAssets().open("tangyan.jpg");
//获得图片的宽、高
BitmapFactory.Options tmpOptions = new BitmapFactory.Options();
tmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, tmpOptions);
int width = tmpOptions.outWidth;
int height = tmpOptions.outHeight;
//设置显示图片的中心区域
BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = bitmapRegionDecoder.decodeRegion(new Rect(width / 2 - 100, height / 2 - 100, width / 2 + 100, height / 2 + 100), options);
mImageView.setImageBitmap(bitmap);
} catch (IOException e)
{
e.printStackTrace();
}
具体特大图,需要做的滑动查看其它区域,可以参考这篇博文:
http://blog.csdn.net/zuo8787/article/details/51406986
放大缩小等各种手势
说之前大家要明白单点与多点的区别:
单手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP
多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.
这种手势缩放操作,一般就是监听到手势变化值,在对应刷新图片,具体操作可以参考下面两篇博文:
http://blog.csdn.net/lmj623565791/article/details/39474553
http://blog.csdn.net/jj120522/article/details/8467810
常用轮子
推荐几款好用的轮子:
UniversalmageLoader(不推荐)
:https://github.com/nostra13/Android-Universal-Image-Loader
优点:部分解决OOM和listview图片错乱,内存缓存,磁盘缓存,使用
Lru算法进行缓存
缺点:停止维护,不推荐使用
Picasso:https://github.com/square/picasso
优点:方便,一句话搞定
Picasso.with(this).load("url").placeholder(R.mipmap.ic_default).into(imageView);
缓存使用的也是LRU算法,线程池对于2/3/4g网络有了不通的表现和优化
缺点:Picasso框架没有实现磁盘缓存,配合OkHttp进行实现。
Glide:https://github.com/bumptech/glide
优点:基于Piscasso,优点他都有,还进行了大量优化,比如,图片使用的是RGB_565,而Piscasso使用的 ARGB_8888 格式,这个内存开销要小一半。
磁盘缓存优化:Picasso 只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,也就意味着 Glide 会根据你 ImageView 的大小来缓存相应大小的
图片尺寸,比如你 ImageView 大小是200*200,原图是 400*400 ,而使用 Glide 就会缓存 200*200 规格的图,而 Picasso 只会缓存 400*400 规格的。
支持gif图片
缺点:包较大,500k,Piscasso只有100k
Fresco:https://github.com/facebook/fresco 优点:OOM优化非常好,从native层优化的,缺点:包较大,除非是专业图片app,否则推荐glide或者Piscasso
ListView
ListView
RecyclerView
优化
自定义View
绘制view
绘制text
SurfaceView
动画
帧动画
补间动画
属性动画
dialog
Fragment
Material Design
Webview
Net
http请求
消息推送,长连接
图片下载优化
音频视频流
App更新
DynamicLoad
热更
DynamicLoadAPK
VirtualAPK
DroidPlugin
Cache
图片缓存
其他缓存
Framework
拦截器框架
动态代理框架
路由框架
JNI
AIDL
优秀轮子
Lottie
GreenDao
未完待续