标题
郭霖 CSDN
小目标:每周3篇,18年看完104篇。
怎么才能知道自己手机屏幕的密度呢?你可以使用如下方法先获取到屏幕的dpi值:
float xdpi = getResources().getDisplayMetrics().xdpi;
float ydpi = getResources().getDisplayMetrics().ydpi;
标题
项目结构分析
dpi详解:
mipmap文件夹只是用来放置应用程序的icon的,仅此而已。那么在此之前,我们都是把应用程序的icon图标和普通的图片资源一起放到drawable文件夹下的。将icon放置在mipmap文件夹还可以让我们程序的launcher图标自动拥有跨设备密度展示的能力
当引用一张图片时,Android会先去本机对应的hdpi下去找,找到引用,不会缩放该图。如果没找到,会优先去高密度下去找,到最高密度下仍没有,就从最适合分辨率往低找。以xxhdpi举例:
drawable-xxhdpi -> drawable-xxxhdpi -> drawable-nodpi -> drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。
最终,如果是从更高密度下引用来的图片,会进行缩小操作(直接加载会出现密度过高);从低密度下引用来的图片,会进行放大操作。drawable-nodpi文件夹,这个文件夹是一个密度无关的文件夹,放在这里的图片系统就不会对它进行自动缩放。至于具体的缩放数据:每一种密度的dpi范围都有一个最大值,这个最大值之间的比例就是图片会被系统自动放大的比例。(郭神测算,未有文档支持。大致是很精确的)
一张原图片被缩小了之后显示其实并没有什么副作用,但是一张原图片被放大了之后显示就意味着要占用更多的内存了。一个xxhdpi设备,从mdpi加载图片,会进行放大操作,放大就会占用更多内存。找到当前主流机型的分辨率,就是当前最佳的分辨率级别。
Getting Your Apps Ready for Nexus 6 and Nexus 9
交互式控件
AlertDialog,会打断用户当前的操作,谨慎一点好。尽量使用appcompat-v7库中也提供了一个AlertDialog类,获得6.0之前的较好体验。
Toast, 建议封装,避免长时间弹。复用一个Toast。传当前Activity的context会内存泄露,传Application的。
SnackBar,体验更好。国内很少用。传View时,传根View。
View rootView = ((ViewGroup) (activity.findViewById(android.R.id.content))).getChildAt(0);make的时候填这个view就可以了
适配
- 合理布局。多使用wrap、match,dp;
- 巧用RelativeLayout,ConstraintLayout;
- 使用布局限定符,配合布局别名结合多布局;
- 根据分辨率,使用多套图。
- 使用AutoLayout。
优化
1启动页优化
styles.xml中主题相关的代码
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
......
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style>
让程序在初始化的时候窗口是透明的,初始化结束后程序主界面才会显示出来,从而也就完全看不到白屏界面了。
记录
03