# IndicatorBox
**Repository Path**: hihopeorg/IndicatorBox
## Basic Information
- **Project Name**: IndicatorBox
- **Description**: IndicatorBox是一个自定义指示框视图
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-09-02
- **Last Updated**: 2021-11-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## **IndicatorBox**
本项目是基于开源项目 IndicatorBox 进行ohos化的移植和开发的,可以通过项目标签以及github地址(https://github.com/wusp/IndicatorBox )追踪到原项目版本
#### 项目介绍
* 项目名称 :IndicatorBox是一个自定义指示框视图
* 所属系列:ohos的第三方组件适配移植
* 功能:底部弹框展示。
* 项目移植状态:完成
* 调用差异:无
* 项目作者和维护人:hihope
* 联系方式:hihope@hoperun.com
* 原项目Doc地址:https://github.com/wusp/IndicatorBox
* 原项目基线版本:无release 版本, shal:039d8373046636510e39144fd93c0da6395986a4
* 编程语言:java
* 外部库依赖:无
#### 效果展示图

#### 安装教程
#### 安装教程
方法(一)
1. 下载IndicatorBox的源码编译依赖包IndicatorBox.har。
2. 启动 DevEco Studio,将下载的har包,导入工程目录“entry->libs”下。
3. 在moudle级别下的build.gradle文件中添加依赖,在dependences标签中增加对libs目录下har包的引用。
4. 在导入的har包上点击右键,选择“Add as Library”对包进行引用,选择需要引用的模块,并点击“OK”即引用成功。
```
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
……
}
```
方法(二)
1.在工程的build.gradle的allprojects中,添加HAR所在的Maven仓地址
```
repositories {
maven {
url 'http://106.15.92.248:8081/repository/Releases/'
}
}
```
2.在应用模块的build.gradle的dependencies闭包中,添加如下代码:
```
dependencies {
implementation 'com.wusp.indicatorbox_library.ohos:indicatorbox:1.0.0'
}
```
#### 使用说明
(1.1) ShrinkButton 使用说明,在ability_shrink_button.xml中,如下:
```
...
...
```
(1.2) ShrinkButton 使用示例, 在ShrinkButtonAbilitySlice.java,如下
```
public class ShrinkButtonAbilitySlice extends AbilitySlice {
...
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_shrink_button);
btnSignIn = (ShrinkButton) findComponentById(ResourceTable.Id_btnSignIn);
popuCompont = (Component) findComponentById(ResourceTable.Id_popuCompont);
screenWidth = DisplayManager.getInstance().getDefaultDisplay(getContext()).get().getAttributes().width;
btnSignIn.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
snackbar("Restart progressing animation if the animation is paused or stoped.");
}
});
DependentLayout fab = (DependentLayout) findComponentById(ResourceTable.Id_DButton);
fab.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
btnSignIn.stop();
snackbar("Pause animation.");
}
});
}
...
}
```
(2.1) ViewPagerIndicator 使用示例,在ability_view_pager_indicator.xml中, 如下
```
...
...
```
(2.2) ViewPagerIndicator 使用示例, ViewPagerIndicatorAbilitySlice.java,如下
```
public class ViewPagerIndicatorAbilitySlice extends AbilitySlice {
private int[] imageRes = {
ResourceTable.Media_icon_1,
ResourceTable.Media_icon_2,
ResourceTable.Media_icon_3
};
private ViewPagerIndicator indicator;
private PageSlider viewPager;
private ArrayList viewSparseArray;
private Component component;
private Text snackText;
private int screenHeight;
private DependentLayout bottomDependentLayout;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_view_pager_indicator);
screenHeight = DisplayManager.getInstance().getDefaultDisplay(getContext()).get().getAttributes().height;
component = findComponentById(ResourceTable.Id_popuCompont);
bottomDependentLayout = (DependentLayout) findComponentById(ResourceTable.Id_bottomDependentLayout);
Text snackText = (Text) findComponentById(ResourceTable.Id_snackText);
viewSparseArray = new ArrayList<>();
indicator = (ViewPagerIndicator) findComponentById(ResourceTable.Id_vpIndicator);
viewPager = (PageSlider) findComponentById(ResourceTable.Id_viewpager);
final ViewPagerAdapter adapter = new ViewPagerAdapter();
viewPager.setProvider(adapter);
indicator.setViewPager(viewPager);
indicatorRes(viewPager, adapter.getCount());
DependentLayout fab = (DependentLayout) findComponentById(ResourceTable.Id_DButton);
fab.setClickedListener(component -> indicator.startInfiniteAnimation());
snackText.setText("Click fab button to start infinite ripple animation.");
AnimatorValue animatorValue = new AnimatorValue();
animatorValue.setCurveType(Animator.CurveType.LINEAR);
animatorValue.setDuration(1000);
animatorValue.setDelay(2000);
int moveHeight = snackText.getHeight();
animatorValue.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() {
@Override
public void onUpdate(AnimatorValue animatorValue, float v) {
bottomDependentLayout.setContentPositionY(screenHeight - bottomDependentLayout.getHeight() - moveHeight + moveHeight * v);
}
});
animatorValue.start();
}
@Override
protected void onInactive() {
super.onInactive();
}
private FlycoPageIndicator indicatorRes(PageSlider viewPager, int count) {
final FlycoPageIndicator itAnim = (FlycoPageIndicator) findComponentById(ResourceTable.Id_indicator_circle_anim);
// 滑动过度动画与指示器子元素动画只能二选一,setIsSnap(true)代表不要滑动过度动画,要子元素动画
itAnim.setIsSnap(true)
.setSelectAnimClass(ZoomInEnter.class)
.setUnselectAnimClass(ZoomInExist.class)
.setPageSlider(viewPager, count);
return itAnim;
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
class ViewPagerAdapter extends PageSliderProvider {
@Override
public int getCount() {
return imageRes.length;
}
@Override
public Object createPageInContainer(ComponentContainer componentContainer, int position) {
Image imageView = new Image(getContext());
ComponentContainer.LayoutConfig lp = new ComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,
ComponentContainer.LayoutConfig.MATCH_PARENT);
imageView.setLayoutConfig(lp);
imageView.setScaleMode(Image.ScaleMode.ZOOM_CENTER);
imageView.setPixelMap(imageRes[position]);
componentContainer.addComponent(imageView);
viewSparseArray.add(position, imageView);
return imageView;
}
@Override
public void destroyPageFromContainer(ComponentContainer componentContainer, int i, Object o) {
componentContainer.removeComponent((Component) o);
viewSparseArray.remove(i);
}
@Override
public boolean isPageMatchToObject(Component component, Object o) {
return component == o;
}
}
}
```
(3.1)FlashBorderView 使用说明,在ability_shrink_button.xml中,如下:content_flash_in.xml
```
```
(3.2)ShrinkButton 使用示例, FlashBorderAbilitySlice.java,如下
```
public class FlashBorderAbilitySlice extends AbilitySlice {
private FlashBorderView flashBorderView;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_flash_border);
flashBorderView = (FlashBorderView) findComponentById(ResourceTable.Id_flashItemView);
final AnimatorValue valueAnimator = new AnimatorValue();
valueAnimator.setDuration(700);
valueAnimator.setValueUpdateListener((animatorValue, v) -> {
flashBorderView.setmFraction(v);
flashBorderView.invalidate(); //from UI thread
});
flashBorderView.setClickedListener(component -> valueAnimator.start());
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
```
#### 版本迭代
- v1.0.0
#### 实现功能
* 按钮加载动画效果
* 圆形指数器闪烁,数值变化
* 页面成功√状态和失败打×状态
* 点赞动画效果
* 矩形按钮边框变化
#### 版权和许可信息
```
The MIT License (MIT)
```