1 Star 0 Fork 1

zhaodongyang / material-intro-screen

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README_PARALLAX.md 17.10 KB
一键复制 编辑 原始数据 按行查看 历史
羽清尘 提交于 2021-11-12 16:18 . update resource url

Parallax-视差视图

“视差”(Parallax)是2D游戏中通过让不同层上的图片用不同的速度移动,来创造视觉深度的方法。视差滚动(Parallax Scrolling) 是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。

1.实现方式

通过前景与背景在场景移动时产生不同的视差,从而达到简单的立体效果. 使页面上很多的元素在相互独立地滚动,但是滚动速度不一致,就做出了漂亮的差异滚动效果。

核心方法为Parallaxable

     /**
      * 设置偏移量
      * @param offset 偏移量比例
      */
     void setOffset(float offset);

2.核心类库

2.1 以系统三种布局为基础改造的视差视图(Parallax view based on three layouts of the system)

2.2 以ComponentContainer,AbilitySlice,Fraction为基础改造的视差基类(Parallax Base Class Reconstructed Based on ComponentContainer,AbilitySlice,Fraction)

3.如何使用

3.1 demo代码:

本库在entry里面添加了相关的代码,用于介绍ParallaxDirectionalLayout,ParallaxDependentLayout, ParallaxStackLayout在ComponentContainer,AbilitySlice,Fraction中如何使用。

demo涉及的类:

demo入口:

代码入口
entrance_link

3.2 使用步骤:

3.2.1 引入类库:

方法1-使用har包
通过library生成har包,添加har包到要集成的libs文件夹内
在entry的gradle内添加如下代码
implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
方法2-使用implementation依赖
allprojects{
    repositories{
        mavenCentral()
    }
}
implementation 'io.openharmony.tpc.thirdlib:material-intro-screen:1.0.2'
方法3-直接拷贝library(material-intro-screen)中parallax文件夹下的所有内容粘贴到需要引用的module即可

3.2.2 使用视差视图:

3.2.2.1 在AbilitySlice里面使用视差视图
[AbilitySlice-ParallaxDependentLayout]
DependentLayout_link

相关类:

一. 首先使用视差的AbilitySlice需要继承ParallaxAbilitySlice(例如:AbilitySliceDemoAbilitySlice)

public class AbilitySliceDemoAbilitySlice extends ParallaxAbilitySlice

二. 布局使用视差视图组件(ability_slice_demo.xml)

<?xml version="1.0" encoding="utf-8"?>
<agency.tango.materialintroscreen.parallax.ParallaxDependentLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    xmlns:zdy="http://schemas.huawei.com/res/ohos/zdy"
   >

    <Text
        ohos:id="$+id:text"
     
        zdy:layout_parallax_Factor="1"
        />



</agency.tango.materialintroscreen.parallax.ParallaxDependentLayout>
  • 1.以ParallaxDependentLayout作为根布局

  • 2.创建自定义命名空间 xmlns:zdy="http://schemas.huawei.com/res/ohos/zdy"

  • 3.在需要滚动的组件上面设置视差因子 zdy:layout_parallax_Factor

  • tips:视差因子 zdy:layout_parallax_Factor不需要带单位,默认视为float类型

三. AbilitySliceDemoAbilitySlice实现三个方法getLayoutId,initView,getRootView

        /**
             * 获取布局ID
             *
             * @return 布局ID
             */
      @Override
      protected int getLayoutId() {
          return ResourceTable.Layout_ability_slice_demo;
      }
    /**
     * 初始化控件
     */
    protected abstract void initView() ;

    /**
     * 获取根控件
     *
     * @return 根控件
     */
    protected abstract @NotNull Component getRootView();

四. AbilitySliceDemoAbilitySlice设置偏移比例---setOffset(offset)

   private void addOffset() {
       if (offset <= 0.9f) {
           offset += 0.1f;
           setOffset(offset);
       }
   }
3.2.2.2 在Fraction里面使用视差视图
[Fraction-ParallaxStackLayout]
StackLayout_link

相关类:

一. 首先使用视差的Ability需要继承FractionAbility(例如:FractionDemoAbility)

   public class FractionDemoAbility extends FractionAbility

二. AbilitySlice里面加载替换Fraction(例如:FractionDemoAbilitySlice)

  • 1.FractionDemoAbilitySlice里面的布局XML设置Fraction的容器(例如下面的StackLayout)
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <StackLayout
        ohos:id="$+id:fragment_container"
        ohos:height="match_parent"
        ohos:width="match_parent"/>

</DirectionalLayout>
  • 2.FractionDemoAbilitySlice加载Fraction
    private void initView() {
        ((FractionAbility) getAbility()).getFractionManager()
                .startFractionScheduler().add(ResourceTable.Id_fragment_container, new FractionDemo()).submit();
    }

三. FractionDemo需要继承ParallaxFraction

public class FractionDemo extends ParallaxFraction   

四. FractionDemo的布局使用视差视图组件(layout_fraction_demo.xml)

<?xml version="1.0" encoding="utf-8"?>
<agency.tango.materialintroscreen.parallax.ParallaxStackLayout
  xmlns:ohos="http://schemas.huawei.com/res/ohos"
  xmlns:zdy="http://schemas.huawei.com/res/ohos/zdy"
 >

  <Text
      ohos:id="$+id:text1_fraction1"
      zdy:layout_parallax_Factor="0.7"/>


  <Text
      ohos:id="$+id:text2_fraction1"
      zdy:layout_parallax_Factor="0.2"/>


</agency.tango.materialintroscreen.parallax.ParallaxStackLayout>
  • 1.以ParallaxStackLayout作为根布局

  • 2.创建自定义命名空间 xmlns:zdy="http://schemas.huawei.com/res/ohos/zdy"

  • 3.在需要滚动的组件上面设置视差因子 zdy:layout_parallax_Factor

  • 4.不同的组件可以设置不同的视差因子数据,偏移的距离也将不同(0.7,0.2)

  • tips:视差因子 zdy:layout_parallax_Factor不需要带单位,默认视为float类型

五. FractionDemo实现两个方法initView,getRootView

    /**
     * 初始化控件
     */
    protected abstract Component initView(LayoutScatter scatter, ComponentContainer container, Intent intent);
    /**
     * 获取根控件
     *
     * @return 根控件
     */
    protected @NotNull Component getRootView() {
        return mRootView;
    }

六. FractionDemo设置偏移比例---setOffset(offset)

   /**
     * 设置组件偏移比
     *
     */
        thisContainer.setTouchEventListener(new Component.TouchEventListener() {
            @Override
            public boolean onTouchEvent(Component component, TouchEvent touchEvent) {
                int width = thisContainer.getWidth();
                if (width <= 0) {
                    return false;
                }
                int action = touchEvent.getAction();
                if (action == TouchEvent.PRIMARY_POINT_DOWN) {
                    originStartX = touchEvent.getPointerScreenPosition(0).getX();
                } else if (action == TouchEvent.POINT_MOVE) {
                    tempX = touchEvent.getPointerScreenPosition(0).getX();
                    float offset = (tempX - originStartX) / width;
                    setOffset(offset);
                } else if (action == TouchEvent.PRIMARY_POINT_UP) {
                    originStartX = 0;
                    tempX = 0;
                    setOffset(0);
                } else if (action == TouchEvent.POINT_MOVE) {
                    originStartX = 0;
                    tempX = 0;
                    setOffset(0);
                }
                return true;
            }
        });
3.2.2.3 自定义ComponentContainer使用视差视图
[ComponentContainer-ParallaxDirectionalLayout]
DirectionalLayout_link

相关类:

一. 首先自定义组件需要继承ParallaxComponentContainer(例如:DemoView)

  public class DemoView extends ParallaxComponentContainer 

二.DemoView实现两个方法initView,getRootView

    /**
     * 初始化控件
     */
    protected abstract void initView();
     /**
      * 获取根控件
      *
      * @return 根控件
      */
     public abstract @NotNull Component getRootView();

三. 自定义组件DemoView的根布局使用视差视图组件(layout_test_view.xml)

<?xml version="1.0" encoding="utf-8"?>
<agency.tango.materialintroscreen.parallax.ParallaxDirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    xmlns:zdy="http://schemas.huawei.com/res/ohos/zdy">

    <Text
        ohos:id="$+id:txt_title"
        zdy:layout_parallax_Factor="0"/>


    <Text
        ohos:id="$+id:txt_title1"
        zdy:layout_parallax_Factor="0.1"/>

    <Text
        ohos:id="$+id:txt_title2"
        zdy:layout_parallax_Factor="0.3"/>


    <Text
        ohos:id="$+id:txt_title3"
        zdy:layout_parallax_Factor="0.6"/>


    <Text
        ohos:id="$+id:txt_title4"  
        zdy:layout_parallax_Factor="0.9"/>


</agency.tango.materialintroscreen.parallax.ParallaxDirectionalLayout>
  • 1.以ParallaxDirectionalLayout作为根布局

  • 2.创建自定义命名空间 xmlns:zdy="http://schemas.huawei.com/res/ohos/zdy"

  • 3.在需要滚动的组件上面设置视差因子 zdy:layout_parallax_Factor

  • 4.不同的组件可以设置不同的视差因子数据,偏移的距离也将不同(0.9,0.3等)

  • tips:视差因子 zdy:layout_parallax_Factor不需要带单位,默认视为float类型

四. ComponentDemoAbilitySlice代码生成自定义组件对象DemoView-(也可以在XML布局文件使用自定义组件)

         adapter.addItem(new DemoView(getContext(), 0));
         adapter.addItem(new DemoView(getContext(), 1));
         adapter.addItem(new DemoView(getContext(), 2));
         adapter.addItem(new DemoView(getContext(), 3));
         adapter.addItem(new DemoView(getContext(), 4));
         adapter.addItem(new DemoView(getContext(), 5));

五. ComponentDemoAdapter如果是代码生成的自定义组件,需要将自定义组件放入容器

    @Override
    public Object createPageInContainer(ComponentContainer componentContainer, int position) {
        DemoView view;
        ComponentContainer.LayoutConfig config = new ComponentContainer.LayoutConfig
                (ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_PARENT);
        if (this.views != null && this.views.size() > position) {
            view = this.views.get(position);
            if (view != null && view.getRootView() != null) {
                componentContainer.addComponent(view.getRootView(), config);
                views.set(position, view);
                return view.getRootView();
            }
        }
        view = this.getItem(position);
        while (this.views.size() <= position) {
            this.views.add(null);
        }
        this.views.set(position, view);
        if (view == null && view.getRootView() != null) {
            componentContainer.addComponent(view.getRootView(), config);
            return view.getRootView();
        } else {
            return new Component(componentContainer.getContext());
        }

    }

六. ComponentDemoAbilitySlice设置偏移比例---setOffset(offset)

  viewPager.addPageChangedListener(new PageSlider.PageChangedListener() {
           @Override
           public void onPageSliding(int position, float positionOffset, int positionOffsetPixels) {
             ...
             adapter.getItem(viewPager.getCurrentPage()).setOffset(tempPositionOffset);
           }

 
       });
1
https://gitee.com/zdy09/material-intro-screen.git
git@gitee.com:zdy09/material-intro-screen.git
zdy09
material-intro-screen
material-intro-screen
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891