Git Product home page Git Product logo

androidscreenadaptation's Introduction

AndroidScreenAdaptation

本库特点

   完全不用改变自己的布局编写习惯,你原先是怎么写布局,就怎么写布局.不用去继承适配类,不用在最外层包裹适配布局,不用新建茫茫多的分辨率适配文件夹,不要求强制使用px为单位,支持代码动态添加view适配,可以实时预览布局,满足旋转和分屏适配,全面屏或带虚拟按键手机适配也没问题.

效果展示

快速开始

  1. 添加依赖

    implementation 'me.yatoooon:screenadaptation:1.1.1'

  2. 初始化工具类

     (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数据,例子上标明了这些数据的代表的意义

<application
        android:name=".App"
        .....
        <meta-data
            android:name="designwidth"
            android:value="1080" />  //设计图的宽,单位是像素,推荐用markman测量,量出来如果是750px那么请尽量去找ui设计师要一份android的设计图.
        <meta-data
            android:name="designdpi"
            android:value="480" />   //设计图对应的标准dpi,根据下面的那张图找到对应的dpi,比如1080就对应480dpi,如果拿到的是其他宽度的设计图,那么选择一个相近的dpi就好了
        <meta-data
            android:name="fontsize"
            android:value="1.0" />   //全局字体的大小倍数,有时候老板会觉得你的所有的字小了或者大了,你总不能一个一个去改吧
        <meta-data
            android:name="unit"
            android:value="px" />   //你的布局里面用的是px这就写px,你的布局里面用的是dp这就写dp,要统一,不要一会儿px一会儿dp,字体也用px或者dp,不要用sp,微信qq用的肯定不是sp.
</application>    
宽         	240 	320 	480 	720     1080 	1440  
DPI等级	        LDPI	MDPI	HDPI	XHDPI	XXHDPI	XXXHDPI
DPI数值	        120	160	240	320	480	640
  1. 开始使用

     (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: [email protected]
  • 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.

androidscreenadaptation's People

Contributors

asunguocai avatar yatoooon avatar yongxinduidai avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

androidscreenadaptation's Issues

动态设置宽高问题

x nnas5gond rr gva_p
动态设置,多次调用ScreenAdapterTools.getInstance().loadView();会多次绘制宽高
举个例子 ,设计图跟实际屏幕的比例为1:2 设置宽度为10,第一次调用,实际宽度为20,第二次调用就变成40

适配问题

tablayout通过style设置的文字大小适配不了

如何适配屏幕高度?

您好,我在试用该库屏幕适配时,如果屏幕的分辨率是一致的话,则完美适配。但是如果分辨率不一致的话,比如一个是19201080,一个是1366768 ,会导致高度无法适配。有办法解决高度也适配的问题吗?哪怕同比率缩放也行。这样不至于因高度不适配导致某些显示的内容被覆盖了显示不出来

水平方向适配,竖直方向无法适配?

设计图纸 1872x1404

基于这个设计图纸写的ui,但是发现在一般手机上,水平方向确实适配很完美,但是竖直方向感觉没有效果,是操作问题还是其他问题,有办法解决吗?望回复,感谢!

沉浸式状态栏有空隙

你好,在沉浸式状态栏使用时,部分机型顶部会留有一道空隙,请问是什么问题呢?

@yatoooon 这个框架能兼容国产魔改的Pad吗?

我看了一下项目的源代码, 注册是以宽度和dpi值决定适配,
在实际开发中, 我碰到有一台国产寨板魔改了系统dpi数据,
一般来说, 一个正常的1080P平板设备的dpi有240是吧, 但是这个魔改Pad把它修改成160了,或者其他的一些数据. 也就是说, 相同尺寸, 相同分辨率, 他的dpi值被魔改成非标准状态了.
在这样的情况下, 该如何适配呢? 现在用的是AutoLayout, 因为这个框架是基于高宽的分辨率,忽略了dpi,所以没有啥问题
但是我看到作者您的框架依赖了dpi, 那如果碰到这样的寨版还能适配吗?

程序会停止

在MainActivity里面直接引用ScreenAdapterTools.getInstance().loadView(getWindow().getDecorView());这个会导致应用的停止,这是为什么呢?

关于高度精确度的问题

我看了下代码,设置高度的时候,可能会有问题,设计图宽和高的比例和实际decorview的宽和高比例不一样,在setValue()方法中,看见的都是以宽度设置为基准的。是不是需要分开算下高度?你这么做是基于什么考虑的?求解答!!!!

横竖

app有些界面是竖屏的有些是横批的该怎么处理呢

关于designdpi取值我给个建议哈

那你看能不能这样处理, 如果designdpi给值是 ***dpi字样, 那大神您就帮忙处理转换算了, 如果给的是具体数字, 那就直接用这个数字...
---来自一个懒惰的程序员的建议...

文字适配问题

使用tablayout的时候,通过tabTextAppearance在style设置TabLayout文字样式,发现适配不了,有没有好的解决方案

ListView 滑动,item内容(文字、图片)会变大

Activity里面包含fragment,fragment里面包含listView,大概是这么个布局,滑动的时候item内容会变大。设计图是10801920,在25601440分辨率的手机里字体或图片变小了,添加适配如下:
Activity里面加了适配"ScreenAdapterTools.getInstance().loadView(getWindow().getDecorView());"
Fragment也加了适配"ScreenAdapterTools.getInstance().loadView(view);"
ListView的adapter里面也加了适配“ScreenAdapterTools.getInstance().loadView(convertView);”

像这种activity里面加了适配,activity所包含的fragment是否也要加,再就是fragment的adapter是否也要加适配?

疑问

楼主,首先,您的这种写法确实方便省事了很多,感谢分享。
有几点建议:
1、最好再组织下使用方法,让人看了简单明了。
2、建议写出相应的使用方法在CSDN上,方便大家知道有这个东西。
3、不同的分辨率显示的大小不是应该不一样吗,哈,为何看着您的效果图有点一样

你这个库在使用上有没有局限性

现在这种百分比布局非常多,用法也大同小异,本质有何区别?
另外其他库都停止维护了,遇到了一些无法解决的问题证明思路不通, 你这个还在更新 是有什么独特的或吸取了前者经验的地方吗?

Toolbar适配

在使用Toolbar时,title是适配了,自定义Toolbar按钮也是没问题的,请问Toolbar自带的返回、menu应该如何适配呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.