首页 » Andorid » 临时分类 » 正文

BackgroudLibrary

BackgroudLibrary

A framework for directly generating shape through Tags, no need to write shape.xml again(通过标签直接生成shape,无需再写shape.xml)

English.md

依赖方式:

implementation "com.android.support:appcompat-v7:$supportVersion"
implementation 'com.noober.background:core:1.4.0'

版本更新:

1.0.5 解决android 8以下Fragment中view显示问题,解决水波纹不能与press事件共存问题,优化水波纹显示
1.2.0 增加对selector的支持
1.2.2 修复部分属性不生效的bug
1.2.3 checkbox radiobutton使用的bug
1.2.4 新增了text不同状态变色的支持
1.2.5 去除kotlin依赖
1.2.6 修复调用其他换肤框架可能失效的问题
1.2.7 新增pressed_stroke_color等边框的属性
1.3.0 提供通过代码生成Drawable的方法;为了防止属性冲突,所有属性以bl_开头
1.3.1 优化代码,减少内存占用
1.3.2 修复与其他框架冲突的bug
1.3.3 修复通过代码创建drawable,白色失效的问题
1.3.4 支持最小sdk从16变为14,如果minSdkVersion < 16:bl_gradient_angle, bl_gradient_startColor, bl_gradient_centerColor, bl_gradient_endColor会失效,其他正常
1.3.5 新增属性bl_checked_button_drawable与bl_unChecked_button_drawable,在checkBox与radiobutton中使用了bl_checked_drawable与bl_unChecked_drawable会与之前版本有区别,
    bl_checked_button_drawable相当于setButtonDrawable,而bl_checked_drawable相当于setBackground,详见demo的radiobutton写法
1.3.6 修复bug
1.3.7 新增属性,使用详见[例子4](#jump1)
1.3.8 新增属性bl_position,可以设置drawable的位置left top right bottom
1.4.0 增加预览功能

示例效果

通过配置Live Templates,实现自动代码提示

使用方法

1、在BaseActivity中的super.onCreate之前调用。**如果minSdkVersion 21生效,如果小于21,会使用默认值:

名称 类型 备注
bl_checkable_stroke_color color 边框状态的属性,如果在sdk21以下,会没有效果,默认固定边框色取stroke_color的值
bl_checked_stroke_color color
bl_enabled_stroke_color color
bl_selected_stroke_color color
bl_pressed_stroke_color color
bl_focused_stroke_color color
bl_unCheckable_stroke_color color
bl_unChecked_stroke_color color
bl_unEnabled_stroke_color color
bl_unSelected_stroke_color color
bl_unPressed_stroke_color color
bl_unFocused_stroke_color color
bl_checkable_solid_color color 填充颜色的属性,如果在sdk21以下,会没有效果,默认固定边框色取solid_color的值
bl_checked_solid_color color
bl_enabled_solid_color color
bl_selected_solid_color color
bl_pressed_solid_color color
bl_focused_solid_color color
bl_unCheckable_solid_color color
bl_unChecked_solid_color color
bl_unEnabled_solid_color color
bl_unSelected_solid_color color
bl_unPressed_solid_color color
bl_unFocused_solid_color color
Drawable drawable3 = new DrawableCreator.Builder()
        .setCornersRadius(dip2px(20))
        .setSolidColor(Color.parseColor("#7CFC00"))//此处相当于api < 21 的默认值
        .setStrokeColor(Color.parseColor("#7CFC00"))//此处相当于api < 21 的默认值
        .setPressedSolidColor(Color.parseColor("#8c6822"), Color.parseColor("#71C671"))
        .setPressedSolidColor(Color.parseColor("#8c6822"), Color.parseColor("#71C671"))
        .setStrokeWidth(dip2px(1))
        .build();

使用例子

1.边框+背景+圆角

等同于

2、渐变

等同于

 <Button />

点击效果

第一个点赞效果:

android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginTop="5dp"
app:bl_pressed_drawable="@drawable/circle_like_pressed"
app:bl_unPressed_drawable="@drawable/circle_like_normal" /&gt;

就等同于:

通过代码设置:

Drawable drawable4 = new DrawableCreator.Builder().setCornersRadius(dip2px(20))
        .setPressedDrawable(ContextCompat.getDrawable(this, R.drawable.circle_like_pressed))
        .setUnPressedDrawable(ContextCompat.getDrawable(this, R.drawable.circle_like_normal))
        .build();
tv.setClickable(true);
tv.setBackground(drawable4);   

第二个按钮效果:

<Button />

通过代码设置:

Drawable drawable3 = new DrawableCreator.Builder().setCornersRadius(dip2px(20))
        .setRipple(true, Color.parseColor("#71C671"))
        .setSolidColor(Color.parseColor("#7CFC00"))
        .setStrokeColor(Color.parseColor("#8c6822"))
        .setStrokeWidth(dip2px(2))
        .build();
btn.setBackground(drawable3);

使用其实基本和selector shape一样。

3.点击文字变色

<Button />

4.点击填充边框变色属性

5.style类似的使用方式

style中不要加入"app:", 直接写属性名即可

    4dp
    #E3B666
    #8c6822
    2dp

6.设置drawableLeft

    <Button />

    <Button />

简单的性能测试

我用原生的方法写了例子里面的shape和selector,做了一个比较简单的测试:

下面两幅图,是没有background时打开MainActivity界面的启动时间和打开ListActivity的启动时间

下面两幅图,是使用原生drawable.xml去设置background时打开MainActivity界面的启动时间和打开ListActivity的启动时间

最后这两幅图,是使用自定义标签去设置background时打开MainActivity界面的启动时间和打开ListActivity的启动时间

可以看得出来,其实通过自定义标签去创建drawable并没有真的很损耗性能,其实与本身的drawable.xml差不多,但是在list中,如果没有使用viewholer,会比较消耗性能,如果使用的话,应该差不多。
不过这个分析比较简单,只能看个大概,给担心性能的同学心里可以有个底。

如何预览

1、如果需要对View进行预览,直接把原来的View换成框架内对应的BLView即可,即可展示预览效果,如果不需要预览可以直接忽略这些用于预览的自定义View;
2、如果没有效果,make project一下即可;
3、如果BLView中没有对应的需要预览的View,可以很简单的自己实现一下,以BLTextView为例:

public class BLTextView extends AppCompatTextView {
    public BLTextView(Context context) {
        super(context);
    }

    public BLTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public BLTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs){
        BackgroundFactory.setViewBackground(context, attrs, this);
    }
}

继承所需要预览的View,然后在构造函数中添加BackgroundFactory.setViewBackground(context, attrs, this)方法即可。
注意
为了提高性能,这些View在编译的时候会自动替换为对应原生的View,所以除了再xml中,不要在代码中出现任何的BLTextView,否则会报类似如下的错误:

//错误
BLTextView button = findViewById(R.id.text);
//正确
BLTextView button = findViewById(R.id.text);


Caused by: java.lang.ClassCastException: android.support.v7.widget.AppCompatTextView cannot be cast to com.noober.background.view.BLTextView

使用注意

1、selector的相关属性,如果传入的drawable不是颜色的资源,会覆盖掉shape设置的属性
2、在根布局添加

    tools:ignore="MissingPrefix"

可以防止报红
3、因为layoutInflater限制了只能有一个factory,如果有其他库已经使用了setFactory方法,比如换肤的库,只需要在其他库调用layoutInflater.setFactory之后调用

BackgroundLibrary.inject2(context);

这样其他的库与本库同样可以生效。
4、selector一个item表示多个属性,暂时无法实现,如下:

因为无法用一个属性去表示两种状态,有思路的同学可以告诉我
5、fragment使用无需任何处理,其Activity调用inject即可
6、listView,recyclerView使用也无需任何处理。 如果不生效,只需要

//在调用inflate只需调用一次context,保证adapter创建View时传入的是同一个context即可
BackgroundLibrary.inject(context);

View item = LayoutInflater.from(context).inflate(xxx)

7、自定义View中调用了inflate,同listView一样处理即可
8、关于水波纹,如果光设置下面两个属性是无效的,必须还要有个填充颜色的属性,原因如下:

app:ripple_color="#71C671"
app:ripple_enable="true"

水波纹需要设置一个默认背景颜色,也就是填充颜色。比如app:solid_color 或者app:unPressed_drawable 或者app:unFocussed_drawable等都行,这些都是默认等背景颜色。而app:ripple_color是波纹的颜色。如果没有一个背景色,这个波纹颜色是无法显示的
9、由于Android源码的原因,如果是通过代码生成有点击状态drawable,或者下列属性需要先调用一下

 view.setClickable(true);

否则点击状态可能不生效

名称 类型 备注
bl_checkable_stroke_color color 边框状态的属性,如果在sdk21以下,会没有效果,默认固定边框色取stroke_color的值
bl_checked_stroke_color color
bl_enabled_stroke_color color
bl_selected_stroke_color color
bl_pressed_stroke_color color
bl_focused_stroke_color color
bl_unCheckable_stroke_color color
bl_unChecked_stroke_color color
bl_unEnabled_stroke_color color
bl_unSelected_stroke_color color
bl_unPressed_stroke_color color
bl_unFocused_stroke_color color
bl_checkable_solid_color color 填充颜色的属性,如果在sdk21以下,会没有效果,默认固定边框色取solid_color的值
bl_checked_solid_color color
bl_enabled_solid_color color
bl_selected_solid_color color
bl_pressed_solid_color color
bl_focused_solid_color color
bl_unCheckable_solid_color color
bl_unChecked_solid_color color
bl_unEnabled_solid_color color
bl_unSelected_solid_color color
bl_unPressed_solid_color color
bl_unFocused_solid_color color

代码提示解决方案

配置Live Templates步骤:
以Android studio3.2为例:
mac:进入目录MacintoshHDuserxxxLibraryPreferencesAndroidStudio3.2templates
windows:进入目录C:UsersXXX.AndroidStudio3.2configtemplates
如果templates不存在,手动创建文件夹即可; 在templates下面加入文件BackgroundLibrary.xml 重启as即可。

效果:

如果有什么问题,方便大家交流,创建了一个qq群,群号887686934,欢迎大家加入

11、bl_position 不能与bl_ripple_enable同时使用

MIT License

Copyright (c) 2018 javaKepp

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
下载 (0)

发表评论