AndroidScreenAdaptation
本库特点
完全不用改变自己的布局编写习惯,你原先是怎么写布局,就怎么写布局.不用去继承适配类,不用在最外层包裹适配布局,不用新建茫茫多的分辨率适配文件夹,不要求强制使用 px 为单位,支持代码动态添加 view 适配,可以实时预览布局,满足旋转和分屏适配,全面屏或带虚拟按键手机适配也没问题.
效果展示
快速开始
添加依赖
implementation 'me.yatoooon:screenadaptation:1.1.1'
初始化工具类
(1.)创建自己的 application 继承 Application ``` public class App extends Application { @Override public void onCreate() {
super.onCreate(); ScreenAdapterTools.init(this);
}
//旋转适配,如果应用屏幕固定了某个方向不旋转的话(比如 qq 和微信),下面可不写. @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); ScreenAdapterTools.getInstance().reset(this); } }
(2.)在 AndroidManifest.xml 文件中声明使用你自己创建的 application 并且添加 meta-data 数据,例子上标明了这些数据的代表的意义
```
宽 240 320 480 720 1080 1440
DPI 等级 LDPI MDPI HDPI XHDPI XXHDPI XXXHDPI
DPI 数值 120 160 240 320 480 640
开始使用
(1.)在 Activity 中,找到 setcontentview(R.layout.xxxxxx)
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_dp); //ScreenAdapterTools.getInstance().reset(this);//如果希望 android7.0 分屏也适配的话,加上这句 //在 setContentView();后面加上适配语句 ScreenAdapterTools.getInstance().loadView(getWindow().getDecorView()); } }
(2.)在 Fragment 或 recyclerview,listview 或 gridview,viewpager,自定义 view 等等等,只要能找到布局填充器(自定义 view 完全是代码绘制的没有用布局填充器怎么办?往下看)
public class TestFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.test_px, container, false);
//拿到布局填充器返回的 view 后
ScreenAdapterTools.getInstance().loadView(view);
return view;
}
}
注: 1.自定义 view 的话,在 ScreenAdapterTools.getInstance().loadView(view); 外面包裹一层判断如下,不然在使用自定义 view 编写布局文件时预览 xml 会有问题!但不影响真机运行效果.
if (!isInEditMode()) {
ScreenAdapterTools.getInstance().loadView(view);
}
2.完全代码绘制的自定义 view 怎么办? 比如说我绘制了个半径为 100dp 的圆,在代码里找到获取半径属性值 circleRadius 的地方
circleRadius = ScreenAdapterTools.getInstance().loadCustomAttrValue(circleRadius);
(3.)现在打开你的布局文件,并且打开预览,点击预览上部的小手机图标选择和你设计图匹配的模拟器,然后就可以按照设计图测量并编写布局文件,测量和编写的单位用 px 还是 dp 取决于你清单文件中的 meta_data 中 unit 填写的值,暂时只支持宽 高 padding layout_margin 字体大小 这几个属性(如果有 minmaxWidthHeight 这种属性值,适配时...loadView(...view,new CustomConversion()),如果有其他需要的属性值,请自行继承 IConversion 和 AbsLoadViewHelper 编写),布局文件完成后,你看到的预览是什么样,各种真机运行出来就是什么样.
原理
那些长篇大论的文章我也不想提,想必读者已经在别处看疯了,知道几个最简单的概念用起来就可以了
1. px 是分辨率的单位 比如现在主流手机分辨率 1080*1920. 2. dp 是安卓开发专有的单位 在 不同的手机下 1dp = 不同的 px.
3. sp 是字体大小(前面清单文件中要求字体也用 dp 或者 px),sp 随系统字体大小变化而变化,但据我观察,像微信 qq 这些 app 的字体是不随系统显示字体大小变化的.
### 本库是按照设计图的宽度的值(单位 px)和对应标准 dpi 来适配的(手机实际宽度相对于设计图增加或减少,高度同比例(这的比例是宽度增加或减少的比例)增加或减少),所有的布局控件都按这个比例(手机实际宽度/设计图宽度)来适配,在不同的分辨率,不同 ppi(手机屏幕密度,又称为 dpi),不同最小宽度(有的人喜欢去调开发者选项下面的最小宽度,主流手机默认为 360dp)的手机下都做到了适配.
联系我
- 最好直接提 issue: qq 和 email 有时候收不到
- Email: qazasdeszplm@126.com
qq: 3529161483
注
6 月 6 日看到了头条技术团队的适配方案,他们是真的机智,虽然文章中有一些表述不太正确,链接:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA ,原理差不多,只不过头条在源头修改了强制修改了 density 进行适配,这种写法是真他娘的省事,我当时怎么就没有想到呢??? 不过如果你有直接写 px 的习惯(UI 大妹子就只给标注 px!),那就用我的框架吧.
6 月 25 日有人和我说头条这个方案在 8.0 以上机型无效,我也没有测,大家自己斟酌.
6 月 28 日有人和我说 8.0 也是可行的,修改 activity 的 density 而不是 application 的 density 就可以。 9 月 05 日推荐使用 jessyan 的 androidautosize,并且推荐开发框架也用他的.版权
Copyright 2018 yatoooon Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.