日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android屏幕适配无效_AndroidAutoLayout

發布時間:2023/12/10 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android屏幕适配无效_AndroidAutoLayout 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Fork說明

compile 'wang.dannyhe.tools:autolayout:1.+'

AndroidAutoLayout

Android屏幕適配方案,直接填寫設計圖上的像素尺寸即可完成適配。

非常感謝 : 吃土豆的人 的協作。

討論群:99913714

效果圖

最大幅度解決適配問題,并且最大化方便開發者。

so,看下用法:

你沒有看錯,拿到設計稿,在布局文件里面直接填寫對應的px即可,px:這里的px并非是Google不建議使用的px,在內部會進行轉化處理。

ok,拿一些實際項目的頁面,看下不同分辨率下的效果:

左為:768 * 1280 ; 右為:1080 * 1920

上述兩個機器的分辨率差距挺大了,但是完美實現了適配,最為重要的是:

再也不用拿著設計稿去想這控件的寬高到底取多少dp

再也不用去為多個屏幕去寫多個dimens

再也不用去計算百分比了(如果使用百分比控件完成適配)

再也不用去跟UI MM去解釋什么是dp了

你所要做的就是抄抄設計稿上面的px,直接寫入布局文件。

還有很多好處,比如上面的Item里面元素比較多,如果標識的比較全面,一個FrameLayout,里面的View填寫各種marginLeft,marginTop就能完美實現,幾乎不需要嵌套了。

引入

Android Studio

dependencies {

compile project(':autolayout')

}

也可以直接

dependencies {

compile 'com.zhy:autolayout:1.4.5'

}

Eclipse

建議使用As,方便版本更新。實在不行,只有復制粘貼源碼了。

用法

第一步:

在你的項目的AndroidManifest中注明你的設計稿的尺寸。

第二步:

讓你的Activity繼承自AutoLayoutActivity.

非常簡單的兩個步驟,你就可以開始愉快的編寫布局了,詳細可以參考sample。

其他用法

如果你不希望繼承AutoLayoutActivity,可以在編寫布局文件時,將

LinearLayout -> AutoLinearLayout

RelativeLayout -> AutoRelativeLayout

FrameLayout -> AutoFrameLayout

這樣也可以完成適配。

目前支持屬性

layout_width

layout_height

layout_margin(left,top,right,bottom)

pading(left,top,right,bottom)

textSize

maxWidth, minWidth, maxHeight, minHeight

配置

默認使用的高度是設備的可用高度,也就是不包括狀態欄和底部的操作欄的,如果你希望拿設備的物理高度進行百分比化:

可以在Application的onCreate方法中進行設置:

public class UseDeviceSizeApplication extends Application

{

@Override

public void onCreate()

{

super.onCreate();

AutoLayoutConifg.getInstance().useDeviceSize();

}

}

預覽

大家都知道,寫布局文件的時候,不能實時的去預覽效果,那么體驗真的是非常的不好,也在很大程度上降低開發效率,所以下面教大家如何用好,用對PreView(針對該庫)。

首先,你要記得你設計稿的尺寸,比如 768 * 1280

然后在你的PreView面板,選擇于設計圖分辨率一致的設備:

然后你就可以看到最為精確的預覽了:

兩個注意事項:

你們UI給的設計圖的尺寸并非是主流的設計圖,該尺寸沒找到,你可以自己去新建一個設備。

不要在PreView中去查看所有分辨率下的顯示,是看不出來適配效果的,因為有些計算是動態的。

擴展

對于其他繼承系統的FrameLayout、LinearLayout、RelativeLayout的控件,比如CardView,如果希望再其內部直接支持"px"百分比化,可以自己擴展,擴展方式為下面的代碼,也可參考issue#21:

package com.zhy.sample.view;

import android.content.Context;

import android.support.v7.widget.CardView;

import android.util.AttributeSet;

import com.zhy.autolayout.AutoFrameLayout;

import com.zhy.autolayout.utils.AutoLayoutHelper;

/**

* Created by zhy on 15/12/8.

*/

public class AutoCardView extends CardView

{

private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);

public AutoCardView(Context context)

{

super(context);

}

public AutoCardView(Context context, AttributeSet attrs)

{

super(context, attrs);

}

public AutoCardView(Context context, AttributeSet attrs, int defStyleAttr)

{

super(context, attrs, defStyleAttr);

}

@Override

public AutoFrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs)

{

return new AutoFrameLayout.LayoutParams(getContext(), attrs);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

{

if (!isInEditMode())

{

mHelper.adjustChildren();

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

}

注意事項

ListView、RecyclerView類的Item的適配

sample中包含ListView、RecyclerView例子,具體查看sample

對于ListView

對于ListView這類控件的item,默認根局部寫“px”進行適配是無效的,因為外層非AutoXXXLayout,而是ListView。但是,不用怕,一行代碼就可以支持了:

@Override

public View getView(int position, View convertView, ViewGroup parent)

{

ViewHolder holder = null;

if (convertView == null)

{

holder = new ViewHolder();

convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);

convertView.setTag(holder);

//對于listview,注意添加這一行,即可在item上使用高度

AutoUtils.autoSize(convertView);

} else

{

holder = (ViewHolder) convertView.getTag();

}

return convertView;

}

注意AutoUtils.autoSize(convertView);這行代碼的位置即可。demo中也有相關實例。

對于RecyclerView

public ViewHolder(View itemView)

{

super(itemView);

AutoUtils.autoSize(itemView);

}

//...

@Override

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)

{

View convertView = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item, parent, false);

return new ViewHolder(convertView);

}

一定要記得LayoutInflater.from(mContext).inflate使用三個參數的方法!

指定設置的值參考寬度或者高度

由于該庫的特點,布局文件中寬高上的1px是不相等的,于是如果需要寬高保持一致的情況,布局中使用屬性:

app:layout_auto_basewidth="height",代表height上編寫的像素值參考寬度。

app:layout_auto_baseheight="width",代表width上編寫的像素值參考高度。

如果需要指定多個值參考寬度即:

app:layout_auto_basewidth="height|padding"

用|隔開,類似gravity的用法,取值為:

width,height

margin,marginLeft,marginTop,marginRight,marginBottom

padding,paddingLeft,paddingTop,paddingRight,paddingBottom

textSize.

TextView的高度問題

設計稿一般只會標識一個字體的大小,比如你設置textSize="20px",實際上TextView所占據的高度肯定大于20px,字的上下都會有一定的間隙,所以一定要靈活去寫字體的高度,比如對于text上下的margin可以選擇盡可能小一點。或者選擇別的約束條件去定位(比如上例,選擇了marginBottom)

常見問題

###(1)導入后出現org/gradle/api/publication/maven/internal/DefaultMavenFactory

最簡單的方式,通過compile 'com.zhy:autolayout:x.x.x'進行依賴使用,如果一定要以module引用,參考該issue#74

###(2)RadioGroup,Toolbar等控件中的子View無法完成適配

這個其實上文已經提到過了,需要自己擴展。不過這個很多使用者貢獻了他們的擴展類可以直接使用,

參考autolayout-widget,

如果沒有發現你需要的容器類,那么你就真的需要自行擴展了,當然如果你完成了擴展,可以給我發個PR,或者讓我知道,我可以加入到

autolayout-widget中方便他人,ps:需要用到哪個copy就好了,不要直接引用autolayout-widget,因為其引用了大量的庫,可能很多

庫你是用不到的。

###(3)java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

這個問題是因為默認AutoLayoutActivity會繼承自AppCompatActivity,所以默認需要設置

Theme.AppCompat的theme;

如果你使用的依舊是FragmentActivity等,且不考慮使用AppCompatActivity,

你可以選擇自己編寫一個MyAutoLayoutActivity extends 目前你使用的Activity基類,例如

MyAutoLayoutActivity extends FragmentActivity,然后將該庫中AutoLayoutActivity中的邏輯

拷貝進去即可,以后你就繼承你的MyAutoLayoutActivity就好了。

ps:還是建議盡快更新SDK版本使用AppCompatActivity.

其他信息

作者信息:

靈感來自:

總結

以上是生活随笔為你收集整理的android屏幕适配无效_AndroidAutoLayout的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。