SchafferWang's blogs

Writed by SchafferWang


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

Android自定义控件之Canvas 绘制

发表于 2018-08-11 | 分类于 android 总结

Canvas 绘制

目录:
    1. 图片文字绘制
    2. 零散内容绘制和画布调整
阅读全文 »

Android显示之Window,WindowManager,WindowManagerService

发表于 2018-08-11 | 分类于 android 总结

Window,WindowManager,WMS

目录:
    - WindowManagerService
    - Window
    - WindowManager
    - WindowManager$LayoutParams
        - flags
        - type
        - softInputMode 请查看关于键盘的内容 相关文献: http://blog.csdn.net/i_lovefish/article/details/8050025
    - Window创建过程
        - activity
        - dialog
        - Toast
阅读全文 »

Android存储之 内部存储与外部存储

发表于 2018-08-11 | 分类于 android 总结

存储方式如下 :
存储方式

阅读全文 »

Android存储之 SharedPreferences

发表于 2018-08-11 | 分类于 android 总结

SharedPreferences

轻量级键值对存储形式.可以被其他应用读取/写入.

目录:
    1. 存储位置
    2. 存储状态
    3. 存储方式
阅读全文 »

Android存储之数据库

发表于 2018-08-11 | 分类于 android 总结

SQLite 操作


  • 目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    1. SQLite ( SQLite 命令中 以"[]"包含的内容表示可省略 )
    - SQLiteHelper
    - 操作
    - 创建数据库
    - 增
    - 删
    - 改
    - 查
    - 关闭数据库
    - 删除数据库
    - SQL语句中的子句
    - SQLite 位运算符

    2. 其他数据库
    - Realm
    - DBFlow
  • 参考

    • SQLite 教程 | 菜鸟教程
    • Android :这是一份详细 & 全面的 SQLlite数据库 使用手册
    • 玩转SQLite系列
阅读全文 »

Android之 Bitmap(上)

发表于 2018-08-11 | 分类于 android 总结

Bitmap

Options解析

属性 含义
inMutable = true,bitmap可编辑,可以作为Canvas的底层Bitmap使用。
= false,bitmap不可变。
inJustDecodeBounds = true,不加载到内存,Native 层解码了图片,未生成Java层的Bitmap;
= false,加载到内存;
outWidth、outHeight inJustDecodeBounds = true 时 Options 得到图片的原始宽高,未经缩放;
inJustDecodeBounds = false 时 加载到内存经缩放的宽高;
outMimeType(String) 从API21开始,属性被废弃,加载图片类型,格式为”image/*”,如:”image/png”,”image/jpeg”;
inPurgeable API19及以下,= true,BitmapFactory 创建的用于存储Bitmap Pixel的内存空间,可以在系统内存不足时被回收。
APP需要再次访问Bitmap的Pixel时(例如:绘制 Bitmap 或是调用getPixel()),系统会再次调用BitmapFactory#decode...()重新生成Bitmap的Pixel数组。
inInputShareable 与 inPurgeable = true 结合使用
= true , 浅拷贝;
= false, 深拷贝;
inSampleSize 图片宽高和像素的取样值做为缩略;
当 inSampleSize = 2 时,宽 / 高方向上2个单位仅取1个单位,2×2 取 1×1。
inPreferredConfig 存储 详解
ALPHA_8 每个像素一个字节(8位),只存储8位的透明度值 不包含颜色信息
RGB_565(默认) 每个像素两个字节(16位),颜色通道比 R:G:B = 5 : 6 : 5 65536 = 2^5 × 2^6 × 2^5,可用相近颜色代替
ARGB_4444 每个像素两个字节(16位),Alpha,R,G,B四个通道每个通道用4位表示 已弃用
ARGB_8888 每个像素四个字节(32位),Alpha,R,G,B四个通道每个通道用8位表示 完全表示32位真彩色,占用内存过大,是RGB_565模式的2倍,是ALPHA_8模式的4倍
inPreferredConfig ≠ null,解码器会尝试使用此参数指定的颜色模式来对图片进行解码
inPreferredConfig = null或者在解码时无法满足此参数指定的颜色模式,
        解码器会自动根据原始图片的特征以及当前设备的屏幕位深,选取合适的颜色模式来解码
  • inBitmap
1
2
3
4
5
6
7
8
9
10
11
12
Bitmap,API11添加用于重用已有的Bitmap

- API 11 ~ API 19

- 被复用的Bitmap的宽高必须等于被加载的Bitmap的原始宽高。(注意这里是指原始宽高,即没进行缩放之前的宽高)
- 被加载Bitmap的Options.inSampleSize = 1。
- 被加载Bitmap的Options.inPreferredConfig字段失效,会被被复用的Bitmap的inPreferredConfig值所覆盖(不然,所占内存可能就不一样了)

- API 19 以上

- 被复用的Bitmap必须是Mutable。违反此限制会返回新申请内存的Bitmap。
- 被复用的Bitmap的内存大小(通过Bitmap.getAllocationByteCount方法获得,API19及以上才有)必须大于等于被加载的Bitmap的内存大小。违反此限制,将会导致复用失败,抛出异常IllegalArgumentException(Problem decoding into existing bitmap)
  • inScaled、inDensity、inTargetDensity、inScreenDensity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
inScaled 表示是否进行缩放,默认 = true;
= true , bitmap.mDensity = inTargetDensity,缩放因子 = inTargetDensity/inDensity;

从res加载图片时,
inDensity = 图片所在文件夹的密度,
inTargetDensity = 系统密度;

从文件加载图片时,默认不缩放
inDensity = inTargetDensity = 0;
inTargetDensity 一般设为系统密度;

= false, bitmap.mDensity = inDensity或者系统默认密度160;

inDensity =
drawable-ldpi:120(dpi)
drawable-mdpi:160(dpi)
drawable-hdpi:240(dpi)
drawable-xhdpi:320(dpi)
drawable-xxhdpi:480(dpi)
drawable-xxxhdpi:640(dpi)
drawable-nodpi:不压缩

附录: drawable 与 mipmap

drawable

drawable适配过程如下:

  • 在对应dpi下找到不缩放使用;
  • 找不到向更高dpi文件夹下查找,找到后缩放使用;
  • 在-nodpi下找到不缩放使用;
  • 找不到向更低dpi文件夹下查找,找到后放大使用;

适配过程

mipmap

用于图标的存放,建议尺寸如下:

密度 建议尺寸
mdpi 48*48
hdpi 72*72
xhdpi 96*96
xxhdpi 144*144
xxxhdpi 192*192

Bitmap内存占用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Bitmap占用内存		
= 每个像素所占字节 × 像素数
[从res/raw加载Bitmap, option.inScaled = true]
= 每个像素所占字节 × (原始宽度 × 缩放因子) × (原始高度 × 缩放因子)
= 每个像素所占字节 × originWidth × originHeight × (inTargetDensity / inDensity)^2
[从res/raw加载Bitmap, option.inScaled = true, 采样缩放]
= 每个像素所占字节 × (originWidth / inSampleSize) × (inTargetDensity / inDensity)
× (originHeight / inSampleSize) × (inTargetDensity / inDensity)

[从File加载Bitmap,默认不缩放]
= 每个像素所占字节 × (originWidth / inSampleSize)
× (originHeight / inSampleSize)

// 复用Bitmap来解码图片时, 表示新解码图片占用内存的大小(并非实际内存大小)
= getByteCount() = getRowBytes() * getHeight()
// 复用Bitmap来解码图片时, 表示被复用Bitmap真实占用的内存大小
≈ getAllocationByteCount() = mBuffer.length //像素数据的字节数组的长度

Bitmap的压缩(点击查看参考原文)

压缩方式有压缩、裁剪、采样三种方式。
第一种方案适用于进行纯粹的文件压缩,而不适用进行图像处理压缩;
第二种方案压缩方案适用于进行图像编辑时的压缩,就像手机自带相册的编辑功能,可以随着裁剪区域的大小进行最终的压缩;
第三种方案相对来说,适应性较强,各种场景都会符合。

压缩(Compress)

将Bitmap按百分率压缩写入到指定格式(jpg/png/...)文件中,以失真的代价压缩,并不改变压缩后文件读入内存中的大小.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private Bitmap getCompressedBitmap(Bitmap bitmap) {
try {
//创建一个用于存储压缩后Bitmap的文件
File compressedFile = FileHelper.createFileByType(mContext, destType, "compressed");
Uri uri = Uri.fromFile(compressedFile);
OutputStream os = getContentResolver().openOutputStream(uri);
Bitmap.CompressFormat format = destType == FileHelper.JPEG ?
Bitmap.CompressFormat.JPEG : Bitmap.CompressFormat.PNG;
// >>>核心部分
boolean success = bitmap.compress(format, 0, os);
// <<<核心部分
if (success) {
T.showLToast(mContext, "success");
}
final String pathName = FileHelper.stripFileProtocol(uri.toString());
showBitmapInfos(pathName);
bitmap = BitmapFactory.decodeFile(pathName);
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}

裁剪(Crop)

裁剪时将整张缩放裁剪后,内存缩小比例 = 整体缩放比例 = 宽度缩放比例 * 高度缩放比例,存入文件也随之变化;

当输出宽高大于原本宽高时,将适得其反。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
private void CropTheImage(Uri imageUrl) {
Intent cropIntent = new Intent("com.android.camera.action.CROP");
cropIntent.setDataAndType(imageUrl, "image/*");
cropIntent.putExtra("cropWidth", "true");
cropIntent.putExtra("outputX", cropTargetWidth);
cropIntent.putExtra("outputY", cropTargetHeight);

//设置输出Uri
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
File file = new File(mContext.getCacheDir(), "test1.jpg");
copyUrl = Uri.fromFile(file);
Uri contentUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", file);
cropIntent.putExtra("output", contentUri);
} else {
File copyFile = FileHelper.createFileByType(mContext, destType, String.valueOf(System.currentTimeMillis()));
copyUrl = Uri.fromFile(copyFile);
cropIntent.putExtra("output", copyUrl);
}
startActivityForResult(cropIntent, REQUEST_CODE_CROP_PIC);
}

//FileHelper.java
public static File createFileByType(Context mContext, int type, String name) {
if (TextUtils.isEmpty(name)) {
name = ".pic";
}

switch (type) {
case JPEG:
name = name + ".jpg";
break;
case PNG:
name = name + ".png";
break;
default:
break;

}
return new File(getTempDirectoryPath(mContext), name);

}

采样(Sample)

宽高同时同量等比缩放,内存占用量 / 取样之前内存占用量 = 1 / (inSampleSize * inSampleSize)。
inSampleSize比1小的话会被当做1,任何inSampleSize的值会被取接近2的幂值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   private Bitmap getRealCompressedBitmap(String pathName, int reqWidth, int reqHeight) {
Bitmap bitmap;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(pathName, options);
int width = options.outWidth / 2;
int height = options.outHeight / 2;
int inSampleSize = 1;

while (width / inSampleSize >= reqWidth && height / inSampleSize >= reqHeight) {
inSampleSize = inSampleSize * 2;
}

options.inSampleSize = inSampleSize;
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(pathName, options);
showBitmapInfos(pathName);
return bitmap;
}

链接:https://juejin.im/post/58bc1f11ac502e006b0957b7

Android交互之 WebView 与 前端交互

发表于 2018-08-11 | 分类于 android 总结

WebView 与 前端交互

  • 参考
    • Android:这是一份全面&详细的Webview使用攻略
    • 最全面总结 Android WebView与 JS 的交互方式
      阅读全文 »

Android之 adb命令

发表于 2018-08-11 | 分类于 android 总结

adb命令[Android Debug Bridge]

adb是一个标准的CS结构的工具, 连接开发电脑和调试手机.包含如下几个部分:

  • Client端, 运行在PC机. 用来发送adb命令.
  • Deamon守护进程, 运行在调试手机或模拟器中.
  • Server端, 后台进程,运行在开发PC机. 用来管理PC中的Client端和手机的Deamon之间的通信.

    其他命令参考:http://www.jianshu.com/p/5980c8c282ef
    
阅读全文 »

Android之 Drawable

发表于 2018-08-11 | 分类于 android 总结

Drawable

分类:
    1. BitmapDrawable
    2. ShapeDrawable
    3. LayerDrawable
    4. StateListDrawable
    5. LevelListDrawable
    6. TransitionDrawable
    7. InsetDrawable
    8. ScaleDrawable
    9. ClipDrawabe
阅读全文 »
12
SchafferWang

SchafferWang

我要一步一步往上爬
只待阳光静静看着它的脸
小小的天有大大的梦想
重重的壳裹着轻轻的仰望

19 日志
3 分类
26 标签
GitHub 微博 知乎 简历
友情链接
  • ios大神_廖坚的性福生活
  • 前端大牛_胡璠的性福生活
© 2018 SchafferWang