鸿蒙开源三方组件------自定义注解布局样式Barber 精华

汪霖
发布于 2021-7-23 17:16
浏览
2收藏

1.Barber简介

一个自定义视图样式库。提供了一个简单的基于自定义注释@StyledAttr的style接口来定义视图样式。通过自定义注释@StyledAttr和@Required,将xml中自定义属性与代码中的变量绑定赋值,保证在不修改代码只调整xml即可达到调整视图的效果。注解@OhosAttr主要针对ohos自身属性,使用方式和@StyledAttr一致。

2.使用一览

2.1注解@StyledAttr的使用

在主界面ability_main.xml中定义如下属性:
鸿蒙开源三方组件------自定义注解布局样式Barber-鸿蒙开发者社区

在BarberView.java代码中使用注解@StyledAttr(value = ResourceTable.String_stripeColor, kind = Kind.COLOR),如下图:
鸿蒙开源三方组件------自定义注解布局样式Barber-鸿蒙开发者社区
不需要再对这三个变量进行赋值,通过注解已经绑定到xml的对应属性,并赋值,直接使用即可,如下图:
鸿蒙开源三方组件------自定义注解布局样式Barber-鸿蒙开发者社区

2.2注解@OhosAttr的使用

OhosAttr的使用和StyleAttr相类似,Xml中定义top_margin为140vp,如图所示:
鸿蒙开源三方组件------自定义注解布局样式Barber-鸿蒙开发者社区
定义变量mTop_margin,使用注解@OhosAttr,mTop_margin不赋值,直接打印mTop_margin, 日志中可以看到mTop_margin成功赋值,为 xml中的ohos:top_margin的值,如下图所示:
鸿蒙开源三方组件------自定义注解布局样式Barber-鸿蒙开发者社区

3.根因分析

在app编译之前,注解编译器编译生成了BarberView$$Barbershop.java文件,对xml进行了解析,并且对注解变量进行了赋值,相当于注解变量和xml属性进行了绑定。
BarberView$$Barbershop.java文件为注解编译器根据compile相关代码自动生成,会根据xml中定义属性变化发生变化。
例如,2.1操作生成的注解文件BarberView$$Barbershop.java代码如下:

package com.io.sweers.barber.sample;

import com.io.sweers.barber.Barber;
import com.io.sweers.barber.api_annotation.WeakHashSet;
import java.lang.Override;
import java.lang.String;
import ohos.agp.components.AttrSet;

public class BarberView$$Barbershop<T extends com.io.sweers.barber.sample.BarberView> implements Barber.IBarbershop<T> {
  protected WeakHashSet lastStyledTargets = new WeakHashSet();

  @Override
  public void style(final T target, final AttrSet set) {
    this.lastStyledTargets.add(target);
    if (set == null) {
      return;
    }
    // Retrieve custom attributes
    String b = target.getContext().getString(33554435);
    if (set.getAttr(b).isPresent()) {
      target.poleWidth = set.getAttr(b).get().getDimensionValue();
    }
    String a = target.getContext().getString(33554436);
    if (set.getAttr(a).isPresent()) {
      target.stripeColorXX = set.getAttr(a).get().getIntegerValue();
    }
    String c = target.getContext().getString(33554437);
    if (set.getAttr(c).isPresent()) {
      target.stripeCount = set.getAttr(c).get().getIntegerValue();
    }
  }

  protected boolean hasStyled(final T target) {
    return this.lastStyledTargets.contains(target);
  }
}

4.如何集成Barber库

4.1方式一

自行编译工程sample,生成api-debug.har,
将其添加到要集成的libs文件夹内,在sample的gradle内添加如下代码:

implementation fileTree(dir:'libs', include:['*.jar','*.har'])

4.2方式二

Barber库已经在maven发布,你可以使用如下依赖引用:

dependencies {
    implementation ‘com.gitee.baijuncheng-open-source:barber:1.0.0’
}

5.下载链接

5.1GitHub源码链接:

https://github.com/hzsweers/barber

5.2Gitee链接:

https://gitee.com/baijuncheng-open-source/barber

3
收藏 2
回复
举报
回复
    相关推荐