package com.zhouwei.mzbanner;
import com.zhouwei.mzbanner.holder.MZHolderCreator;
import com.zhouwei.mzbanner.holder.MZViewHolder;
import com.zhouwei.mzbanner.utils.AttrUtils;
import com.zhouwei.mzbanner.utils.DensityUtils;
import com.zhouwei.mzbanner.utils.LogUtil;
import ohos.agp.components.*;
import ohos.agp.window.service.DisplayManager;
import ohos.app.Context;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;
import ohos.multimodalinput.event.TouchEvent;
import java.util.ArrayList;
import java.util.List;
/**
* Created by zhouwei on 17/5/26.
*/
public class MZBannerView<T> extends DependentLayout implements Component.TouchEventListener {
private static final String TAG = "MZBannerView";
private CustomViewPager mViewPager;
private MZPagerAdapter mAdapter;
private List<T> mDatas;
private boolean mIsAutoPlay = true;// 是否自动播放
private int mCurrentItem = 0;//当前位置
private EventHandler mHandler = new EventHandler(EventRunner.create());
private int mDelayedTime = 3000;// Banner 切换时间间隔
// private ViewPagerScroller mViewPagerScroller;//控制ViewPager滑动速度的Scroller
private boolean mIsOpenMZEffect = true;// 开启魅族Banner效果
private boolean mIsCanLoop = true;// 是否轮播图片
private DirectionalLayout mIndicatorContainer;//indicator容器
private ArrayList<Image> mIndicators = new ArrayList<>();
//mIndicatorRes[0] 为为选中,mIndicatorRes[1]为选中
private int[] mIndicatorRes = new int[]{ResourceTable.Media_indicator_normal, ResourceTable.Media_indicator_selected};
private int mIndicatorPaddingLeft = 0;// indicator 距离左边的距离
private int mIndicatorPaddingRight = 0;//indicator 距离右边的距离
private int mIndicatorPaddingTop = 0;//indicator 距离上边的距离
private int mIndicatorPaddingBottom = 0;//indicator 距离下边的距离
private int mMZModePadding = 0;//在仿魅族模式下,由于前后显示了上下一个页面的部分,因此需要计算这部分padding
private int mIndicatorAlign = 1;
private PageSlider.PageChangedListener mOnPageChangeListener;
private BannerPageClickListener mBannerPageClickListener;
/**
* 中间Page是否覆盖两边,默认覆盖
*/
private boolean mIsMiddlePageCover = true;
private static final String open_mz_mode = "open_mz_mode";
private static final String middle_page_cover = "middle_page_cover";
private static final String canLoop = "canLoop";
private static final String indicatorAlign = "indicatorAlign";
private static final String indicatorPaddingLeft = "indicatorPaddingLeft";
private static final String indicatorPaddingRight = "indicatorPaddingRight";
private static final String indicatorPaddingTop = "indicatorPaddingTop";
private static final String indicatorPaddingBottom = "indicatorPaddingBottom";
public enum IndicatorAlign {
LEFT,//做对齐
CENTER,//居中对齐
RIGHT //右对齐
}
public MZBannerView(Context context) {
super(context);
init();
}
public MZBannerView(Context context, AttrSet attrs) {
super(context, attrs);
readAttrs(attrs);
init();
}
public MZBannerView(Context context, AttrSet attrs, String defStyleAttr) {
super(context, attrs, defStyleAttr);
readAttrs(attrs);
init();
}
private void readAttrs(AttrSet attrs) {
mIsOpenMZEffect = AttrUtils.getBooleanFromAttr(attrs, open_mz_mode, true);
mIsMiddlePageCover = AttrUtils.getBooleanFromAttr(attrs, middle_page_cover, true);
mIsCanLoop = AttrUtils.getBooleanFromAttr(attrs, canLoop, true);
mIndicatorAlign = IndicatorAlign.CENTER.ordinal();
mIndicatorPaddingLeft = AttrUtils.getDimensionFromAttr(attrs, indicatorPaddingLeft, 0);
mIndicatorPaddingRight = AttrUtils.getDimensionFromAttr(attrs, indicatorPaddingRight, 0);
mIndicatorPaddingTop = AttrUtils.getDimensionFromAttr(attrs, indicatorPaddingTop, 0);
mIndicatorPaddingBottom = AttrUtils.getDimensionFromAttr(attrs, indicatorPaddingBottom, 0);
String indicatorAlignValue = AttrUtils.getStringFromAttr(attrs, indicatorAlign, IndicatorAlign.CENTER.name());
if (indicatorAlignValue != null && indicatorAlignValue.length() > 0) {
switch (indicatorAlignValue) {
case "left":
mIndicatorAlign = IndicatorAlign.LEFT.ordinal();
break;
case "center":
mIndicatorAlign = IndicatorAlign.CENTER.ordinal();
break;
case "right":
mIndicatorAlign = IndicatorAlign.RIGHT.ordinal();
break;
}
}
LogUtil.error(TAG, "1====readAttrs====" + mIsOpenMZEffect + "," + mIsMiddlePageCover + "," + mIsCanLoop + "," + mIndicatorPaddingTop + "," + mIndicatorPaddingBottom);
}
private void init() {
Component view = null;
if (mIsOpenMZEffect) {
view = LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_mz_banner_effect_layout, this, true);
} else {
view = LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_mz_banner_normal_layout, this, true);
}
mIndicatorContainer = (DirectionalLayout) view.findComponentById(ResourceTable.Id_banner_indicator_container);
mViewPager = (CustomViewPager) view.findComponentById(ResourceTable.Id_mzbanner_vp);
// mViewPager.setOffscreenPageLimit(4);
// mViewPager.setPageCacheSize(4);
mMZModePadding = DensityUtils.dpToPx(30, getContext());
// 初始化Scroller
initViewPagerScroll();
sureIndicatorPosition();
setTouchEventListener(this);
}
/**
* 是否开启魅族模式
*/
private void setOpenMZEffect() {
// 魅族模式
if (mIsOpenMZEffect) {
mViewPager.setClipEnabled(true);
}
}
/**
* make sure the indicator
*/
private void sureIndicatorPosition() {
if (mIndicatorAlign == IndicatorAlign.LEFT.ordinal()) {
setIndicatorAlign(IndicatorAlign.LEFT);
} else if (mIndicatorAlign == IndicatorAlign.CENTER.ordinal()) {
setIndicatorAlign(IndicatorAlign.CENTER);
} else {
setIndicatorAlign(IndicatorAlign.RIGHT);
}
}
/**
* 设置ViewPager的滑动速度
*/
private void initViewPagerScroll() {
// try {
// Field mScroller = null;
// mScroller = ViewPager.class.getDeclaredField("mScroller");
// mScroller.setAccessible(true);
// mViewPagerScroller = new ViewPagerScroller(
// mViewPager.getContext());
// mScroller.set(mViewPager, mViewPagerScroller);
//
// } catch (NoSuchFieldException e) {
// e.printStackTrace();
// } catch (IllegalArgumentException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// }
}
private final Runnable mLoopRunnable = new Runnable() {
@Override
public void run() {
LogUtil.error(this.getClass().getName(), "1=======mLoopRunnable 55555===" + mAdapter.getCount() + "," + mIsAutoPlay);
if (mIsAutoPlay) {
mCurrentItem = mViewPager.getCurrentPage();
LogUtil.error(this.getClass().getName(), "1=======mLoopRunnable START===" + mCurrentItem);
mCurrentItem++;
LogUtil.error(this.getClass().getName(), "1=======mLoopRunnable 0===" + mAdapter.getCount());
if (mCurrentItem == mAdapter.getCount() - 1) {
LogUtil.error(this.getClass().getName(), "1=======mLoopRunnable 1===" + mCurrentItem);
mCurrentIt
没有合适的资源?快使用搜索试试~ 我知道了~
仿魅族BannerView,图片轮播控件,支持多种模式切换
共55个文件
java:13个
png:8个
xml:7个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 119 浏览量
2024-01-08
11:06:13
上传
评论
收藏 25.12MB ZIP 举报
温馨提示
仿魅族BannerView,图片轮播控件,支持多种模式切换:普通ViewPager使用,普通Banner使用,仿魅族Banner使用。支持本地图片和网络图片轮播。不支持仿魅族的轮播左右边界样式
资源推荐
资源详情
资源评论
收起资源包目录
MZBannerView-master.zip (55个子文件)
MZBannerView-master
gradle.properties 549B
gradle
wrapper
gradle-wrapper.jar 57KB
gradle-wrapper.properties 200B
screenshot
mzbanner.gif 18.49MB
gradlew.bat 3KB
entry
src
test
java
com
zhouwei
mzbanner
sample
ExampleTest.java 135B
ohosTest
java
com
zhouwei
mzbanner
sample
ExampleOhosTest.java 426B
config.json 842B
main
resources
base
media
banner4.png 1.8MB
image1.jpg 31KB
image5.jpeg 50KB
image2.jpeg 47KB
banner3.png 1.48MB
image6.jpeg 56KB
image7.jpeg 56KB
image4.jpeg 79KB
image8.jpeg 30KB
banner2.png 1.69MB
banner1.png 1.03MB
icon.png 7KB
image3.jpeg 47KB
banner5.png 208KB
element
string.json 200B
graphic
background_ability_main.xml 180B
blue_ability_main.xml 180B
layout
banner_item.xml 417B
ability_main.xml 2KB
ability_net_main.xml 2KB
java
com
zhouwei
mzbanner
sample
MZBannerViewApp.java 2KB
MainAbility.java 1KB
slice
MainAbilitySlice.java 5KB
NetImagesAbilitySlice.java 7KB
config.json 1KB
build.gradle 524B
.gitignore 7B
CHANGELOG.md 115B
build.gradle 813B
settings.gradle 30B
mzbanner
src
main
resources
base
media
indicator_normal.png 459B
indicator_selected.png 465B
element
string.json 85B
layout
mz_banner_effect_layout.xml 875B
mz_banner_normal_layout.xml 797B
java
com
zhouwei
mzbanner
CustomViewPager.java 465B
utils
LogUtil.java 2KB
AttrUtils.java 3KB
DensityUtils.java 867B
MZBannerView.java 27KB
holder
MZViewHolder.java 285B
MZHolderCreator.java 178B
config.json 453B
build.gradle 249B
.gitignore 7B
gradlew 6KB
.gitignore 341B
共 55 条
- 1
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6651
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 使用 C 语言实现的计算非负整数的阶乘
- 2011-2021最新版本北京大学数字普惠金融指数(PKU-DFIIC).xlsx
- 县域数字乡村指数2018-2020(1).xlsx
- Docker容器配置进阶
- tensorflow-gpu-2.7.4-cp37-cp37m-manylinux2010-x86-64.whl
- 多段线、 圆、弧转多段线(仅我可见)
- tensorflow-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- 李慧琴C语言基础部分.zip
- yeyue-p8Yi4-ve4a83792.apk
- tensorflow-gpu-2.7.3-cp38-cp38-manylinux2010-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功