android 夜间模式 遮罩,GitHub - a-liYa/AndroidUiMode: 让Android app日、夜间模式实现起来更简单...

AndroidUiMode v2.x

让日夜间模式实现起来更简单

最新版本

简介

v3.x Migrate to Androidx

为了方便升级过度,v2.x目前完全兼容v1.x的方案;v2.x是结合官方v7包日夜主题实现的(参考AppCompatDelegate.NightMode)。

src/main/res目录文件夹规则:

res

|____color

|____color-night

|____drawable

|____drawable-night

|____layout

|____mipmap-night-xxhdpi

|____mipmap-xxhdpi

|____values

|____values-night

一、添加依赖

dependencies {

compile 'com.aliya:android-uimode:3.0.0'

compile 'androidx.appcompat:appcompat:x.x.x'

}

初始化 Application#onCreate(); 参考示例代码 UiMode.init(context)

/*

* public static void init(Context context) {

* sContext = context.getApplicationContext();

* UiModeManager.init(sContext, null);

* UiModeManager.setDefaultUiMode(_get().uiMode);

* }

*/

BaseActivity#onCreate(Bundle);

protected void onCreate(Bundle savedInstanceState) {

UiModeManager.setInflaterFactor(getLayoutInflater());

super.onCreate(savedInstanceState);

}

实现日夜模式切换的Activity必须是AppCompatActivity的子类

public class BaseActivity extends AppCompatActivity {

}

拓展类型

UiModeManager.addSupportUiApply(String, UiApply);

AndroidManifest.xml 配置 configChanges="uiMode", 不然会调用Activity#recreate()

android:name=".xx"

android:configChanges="uiMode" />

三、ImageView夜间模式用法

夜间模式有默认值,若想修改分别配置

res

|____values

|   |____colors.xml

@android:color/transparent

res

|____values-night

|   |____colors.xml

#7f000000

通过app:maskColor自定义属性配置遮罩颜色

android:layout_width="wrap_content"

android:layout_height="wrap_content"

app:maskColor="@color/ic_color" />

去掉遮罩

app:maskColor="@android:color/transparent"

四、uiMode_ignore属性

属性声明

如下配置,当日夜间模式切换时会忽略src属性

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginRight="15dp"

android:src="@mipmap/ic_nav_bar_back_dark"

app:uiMode_ignore="src" />

五、invalidate属性

app:invalidate="true" 表示日、夜间模式切换会调用对应View.invalidate()来刷新

场景:RecyclerView的分割线,当日、夜间模式切换时,RecyclerView不刷新分割线的颜色就不会变化

六、MaskImageView功能

6.1 圆角相关

属性声明

实现四个圆角半径均为5dp,xml代码如下

android:layout_width="50dp"

android:layout_height="50dp"

app:radius="5dp" />

实现四个圆角分别为5dp、6dp、7dp、8dp,xml代码如下

android:layout_width="50dp"

android:layout_height="50dp"

app:radius_leftTop="5dp"

app:radius_rightTop="6dp"

app:radius_rightBottom="7dp"

app:radius_leftBottom="8dp" />

实现裁剪成椭圆,当宽高相等时即为圆

android:layout_width="100dp"

android:layout_height="50dp"

app:radius_oval="true" />

实现裁剪成圆,并添加边框

android:layout_width="50dp"

android:layout_height="50dp"

app:border_color="@color/color_border_color"

app:border_width="2dp"

app:radius_oval="true" />

6.2 固定宽高比属性

属性声明

实现宽高比为1:1,注意:宽、高

android:layout_width="100dp"

android:layout_height="wrap_content"

app:ratio_w2h="1:1" />

6.3 夜间模式遮罩规则

属性声明

xml配置,默认为false

android:layout_width="match_parent"

android:layout_height="wrap_content"

app:maskUnion="true" />

七、自定义View日夜模式切换的实现

实现接口UiModeChangeListener,模版如下

public class CustomView extends View implements UiModeChangeListener {

@Override

public void onUiModeChange() {

// UiMode切换,在此处刷新属性

}

}

八、其他相关用法

8.1 Activity监听UiMode切换

Activity实现接口UiModeChangeListener

public class MainActivity extends AppCompatActivity implements UiModeChangeListener {

@Override

public void onUiModeChange() {

// UiMode切换在此回调

}

}

九、已知问题

9.1 遮罩问题

当 drawable 通过xml定义旋转90度,且原图是长方形时,应用在 : ImageView - android:src,TextView - android:drawableTop 等属性,存在被裁剪的问题。

android:drawable="@mipmap/ic_arrow_bottom"

android:fromDegrees="90"

android:pivotX="50%"

android:pivotY="50%"

android:toDegrees="90" />

十、UML

AndroidUiMode_UML.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值