鸿蒙开源三方组件------自定义注解布局样式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);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

4.如何集成Barber库

4.1方式一

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

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

4.2方式二

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

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

5.下载链接

5.1GitHub源码链接:

https://github.com/hzsweers/barber

5.2Gitee链接:

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

3
收藏 2
回复
举报
3
2


回复
    相关推荐