android轮播引导页,ViewPager打造轮播图Banner/引导页Guide

前言

去年7月时,在Github发布了一个开源的Banner库,虽然Star不多,但还是有少部分人使用。

Banner效果:

1782e742a6ef3cfcd47313ce17507f49.gif

昨天,有使用此库的同学提出需求,想在引导页的时候用这个库并且最后一页有进入按钮如何实现,为满足他的需求,也方便更多开发者是快速实现。进行了简单的扩展支持Guide模式的使用。

Guide效果图:

bb097fd3ab44c0e12ad1df3e29b41693.gif

OK,效果如图所以,咱们此库满足了既可在Banner上使用也可以快速在第一次安装应用的时候引导页使用。

Banner与Guide有什么区别?

引导页的最后一页有按钮,Banners没有

引导页的底部原点距离较大,Banners可以几乎固定

Banner基础上扩展实现第一步:添加按钮

xmlns:app="http://schemas.android.com/apk/res-auto"

android:id="@+id/layout"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/gallery"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:unselectedAlpha="1">

android:id="@+id/indicatorLayout"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:gravity="center"

android:orientation="horizontal"

android:padding="20dp">

android:id="@+id/btn_start"

android:layout_width="104dp"

android:layout_height="29dp"

android:layout_above="@id/indicatorLayout"

android:layout_centerHorizontal="true"

android:layout_marginBottom="40dp"

android:background="@drawable/banners_btn_shape"

android:gravity="center"

android:text="立即开启"

android:textColor="#f24814"

android:textSize="12sp" />

相比于原来咱们新增了按钮,这时候咱们按照这个布局运行在每一个界面都包含了Button,而引导页模式只有在最后一页需要展示按钮。

Banner基础上扩展实现第二步:按钮的控制与模式支持

模式的支持

attrs.xml下新增自定义属性

按钮的控制

在ViewPager中咱们控制按钮可以在ViewPager.OnPageChangeListener的接口方法中onPageScrolled进行控制

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

Log.d("LMBanners", "onPageScrolled was invoke()");

int realPosition = position %= showCount;

if(!isGuide){

btnStart.setVisibility(View.GONE);

return;

}

if (realPosition == getItemCount() - 2) {

if (positionOffset > 0.5f) {

if (btnStart != null) {

ViewHelper.setAlpha(btnStart, positionOffset);

btnStart.setVisibility(View.VISIBLE);

}

} else {

btnStart.setVisibility(View.GONE);

}

} else if (realPosition == getItemCount() - 1) {

if (positionOffset < 0.5f) {

btnStart.setVisibility(View.VISIBLE);

ViewHelper.setAlpha(btnStart, 1.0f - positionOffset);

} else {

btnStart.setVisibility(View.GONE);

}

} else {

btnStart.setVisibility(View.GONE);

}

}

以上代码中isGuide咱们判断是哪一种模式,如果不是Guide引导页模式,直接设置按钮不显示,并且跳出程序。

如果是Guide引导页模式,咱们针对倒数第二页与最后的控制的滑动距离来判断了按钮的显示。

核心点:

positionOffset:表示滑动的距离

向左滑动1—->>0.5>>0

向右滑动0—->>0.5>>1

根据滑动的距离进行按钮的一个渐变显示。

Banner基础上扩展实现第三步:按钮的点击回调

点击按钮需要执行开发者的自身逻辑跳转,咱们用接口回调完成

public interface onStartListener {

void startOpen();

}

Banner基础上扩展实现第四步:Guide模式使用方式

对比banner只需要增加以下代码,如果需要其他属性可以自己设置(如,不自动滚动,不设置循环播放等等)

//设置为全屏

mLBanners.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));

//true为Guide模式,false为banner模式

mLBanners.isGuide(true);

mLBanners.setOnStartListener(new LMBanners.onStartListener() {

@Override

public void startOpen() {

//回调跳转的逻辑

Toast.makeText(MainActivity.this,"我要进入主界面",1).show();

}

});

到此,咱们的banner图升级为Guide模式的图库就完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建一个新的Activity作为引导,例如GuideActivity。 2. 在GuideActivity的布局文件中添加一个ViewPager2控件。 3. 创建一个适配器类,继承自ViewPager2.Adapter,并实现三个方法:getItemCount()、createViewHolder()和bindViewHolder()。 4. 在getItemCount()方法中返回引导的数量。 5. 在createViewHolder()方法中创建一个View,将其包装在一个ViewHolder中并返回。 6. 在bindViewHolder()方法中设置每一的内容。 7. 在GuideActivity中,将ViewPager2控件与适配器关联,并设置面切换动画。 8. 最后,在GuideActivity中添加一个按钮,用于跳过引导并进入主界面。 以下是示例代码: 1. GuideActivity布局文件: ``` <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 引导适配器类: ``` public class GuideAdapter extends ViewPager2.Adapter<GuideAdapter.ViewHolder> { private List<Integer> images; public GuideAdapter(List<Integer> images) { this.images = images; } @Override public int getItemCount() { return images.size(); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_guide, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.imageView.setImageResource(images.get(position)); } static class ViewHolder extends RecyclerView.ViewHolder { ImageView imageView; public ViewHolder(@NonNull View itemView) { super(itemView); imageView = itemView.findViewById(R.id.image); } } } ``` 3. 在GuideActivity中使用适配器: ``` public class GuideActivity extends AppCompatActivity { private ViewPager2 viewPager; private GuideAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); viewPager = findViewById(R.id.viewPager); adapter = new GuideAdapter(Arrays.asList(R.drawable.guide_1, R.drawable.guide_2, R.drawable.guide_3)); viewPager.setAdapter(adapter); viewPager.setPageTransformer(new ZoomOutPageTransformer()); // 设置面切换动画 Button skipButton = findViewById(R.id.skip_button); skipButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(GuideActivity.this, MainActivity.class)); // 跳过引导 finish(); } }); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值