android banner的比例,Android_首页Banner的封装
改进版 bannerLayout(强烈建议使用此版本):
设置一个接口得到想要的数据
public interface BannerInterface {
ViewPager getViewPager();
LinearLayout getLinearLayout();
BasePagerAdapter getBannerAdapter();
}
封装PagerAdapter这里对外提供两个方法,一个点击事件,一个获取数据的方法
public abstract class BasePagerAdapter extends PagerAdapter {
public List mDatas = null;
public BasePagerAdapter(List mDatas) {
this.mDatas = mDatas;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position %= mDatas.size();
ImageView img = new ImageView(container.getContext());
img.setScaleType(ImageView.ScaleType.CENTER_CROP);
//这里是本地数据,如果是网络数据请使用Glide或者其他的加载工具实现
// Glide.with(context).load(url).placeholder(R.drawable.bili_default_image)
// .error(R.drawable.bili_default_image).centerCrop().into(imageView);
//用Glide举例,一般url是String类型,把displayImage改成String即可
img.setBackgroundResource(displayImage(position));
final int finalPosition = position;
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onImageClick(finalPosition, mDatas.get(finalPosition));
}
});
container.addView(img);
return img;
}
protected abstract int displayImage(int position);
protected abstract void onImageClick(int finalPosition, T mDatas);
}
最重要的BannerHolder这里面实现了轮播以及小圆点,因为主要的控件以及数据已经通过接口取到了,所以这里只需要实现逻辑即可,这个类是通用的。
public class BannerHolder implements ViewPagerHandlerUtils.ViewPagerCurrent {
private int preEnablePosition = 0;
private ViewPager mViewPager;
private ViewPagerHandlerUtils mHandlerUtil;
private LinearLayout mLinearLayout;
public void setBanner(final List banner, BannerInterface bannerInterface) {
initHolder(banner.size(), bannerInterface);
mViewPager.setCurrentItem((Integer.MAX_VALUE / 2) - ((Integer.MAX_VALUE / 2) % banner.size()));
mHandlerUtil = new ViewPagerHandlerUtils(this, mViewPager.getCurrentItem());
//提供了setStart() 这个方法 如果想实现 在发送消息之前设置为false就行了
mHandlerUtil.sendEmptyMessage(ViewPagerHandlerUtils.MSG_START);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int newPosition = position % banner.size();
mLinearLayout.getChildAt(preEnablePosition).setEnabled(false);
mLinearLayout.getChildAt(newPosition).setEnabled(true);
preEnablePosition = newPosition;
mHandlerUtil.sendMessage(Message.obtain(mHandlerUtil, ViewPagerHandlerUtils.MSG_PAGE, mViewPager.getCurrentItem(), 0));
}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_DRAGGING:
mHandlerUtil.sendEmptyMessage(ViewPagerHandlerUtils.MSG_KEEP);
break;
case ViewPager.SCROLL_STATE_IDLE:
mHandlerUtil.sendEmptyMessageDelayed(ViewPagerHandlerUtils.MSG_UPDATE, ViewPagerHandlerUtils.MSG_DELAY);
break;
}
}
});
}
@Override
public void setCurrentItem(int page) {
mViewPager.setCurrentItem(page);
}
private void initHolder(int bannerCount, BannerInterface bannerInterface) {
mViewPager = bannerInterface.getViewPager();
mLinearLayout = bannerInterface.getLinearLayout();
mViewPager.setAdapter(bannerInterface.getBannerAdapter());
initRound(bannerCount);
}
private void initRound(int bannerCount) {
if (null != mLinearLayout) {
mLinearLayout.removeAllViews();
for (int i = 0; i < bannerCount; i++) {
View view = new View(mLinearLayout.getContext());
view.setBackgroundResource(R.drawable.point_background);
if (i == 0) {
view.setEnabled(true);
} else {
view.setEnabled(false);
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(15, 15);
view.setLayoutParams(params);
params.leftMargin = 10;
mLinearLayout.addView(view);
}
}
}
}
Handler去实现轮播的效果
public class ViewPagerHandlerUtils extends Handler {
public static final int MSG_START = 0; //开始轮播
public static final int MSG_UPDATE = 1; //更新
public static final int MSG_KEEP = 2; //暂停
public static final int MSG_BREAK = 3; // 恢复
public static final int MSG_PAGE = 4; //最新的page
public static final long MSG_DELAY = 2000; //time
private ViewPagerCurrent mCurrent;
private int page = 0;
public boolean isStart() {
return isStart;
}
public void setStart(boolean start) {
isStart = start;
}
private boolean isStart = true;
public ViewPagerHandlerUtils(ViewPagerCurrent viewPager, int currentItem) {
this.page = currentItem;
this.mCurrent = viewPager;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (hasMessages(MSG_UPDATE)) {
removeMessages(MSG_UPDATE);
}
if (null == mCurrent) {
return;
}
if (!isStart) {
return;
}
switch (msg.what) {
case MSG_START:
sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY);
break;
case MSG_UPDATE:
mCurrent.setCurrentItem(++page);
sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY);
break;
case MSG_PAGE:
page = msg.arg1;
break;
case MSG_KEEP:
break;
case MSG_BREAK:
sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY);
break;
default:
sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY);
break;
}
}
public interface ViewPagerCurrent {
void setCurrentItem(int page);
}
}
封装完成,在代码中实现adapter
public class PagerAdapter extends BasePagerAdapter {
public PagerAdapter(List mDatas) {
super(mDatas);
}
@Override
protected int displayImage(int position) {
return mDatas.get(position).getImageId();
}
@Override
protected void onImageClick(int finalPosition, PagerModel mDatas) {
}
}Activity
public class MainActivity extends AppCompatActivity implements BannerInterface {
private List mDatas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDatas.add(new PagerModel(R.drawable.banner1));
mDatas.add(new PagerModel(R.drawable.banner2));
mDatas.add(new PagerModel(R.drawable.banner3));
mDatas.add(new PagerModel(R.drawable.banner4));
new BannerHolder().setBanner(mDatas, this);
}
@Override
public ViewPager getViewPager() {
return (ViewPager) findViewById(R.id.viewPager);
}
@Override
public LinearLayout getLinearLayout() {
return (LinearLayout) findViewById(R.id.ll_points);
}
@Override
public BasePagerAdapter getBannerAdapter() {
return new PagerAdapter(mDatas);
}
}
至此封装Banner完成,而且在项目中没有出现问题。以后使用起来不管是RecyclerView里面还是activity里面,只要几行简单的代码就可以实现Banner的轮播以及小圆点。
最后看下实际效果图
android banner的比例,Android_首页Banner的封装相关推荐
- 微服务项目实战技术点汇总:“尚硅谷的谷粒在线教育”七、redis数据库缓存页面数据、使用NUXT框架搭建前台系统环境、前台系统页面、首页轮播图(banner数据显示)、首页热门课程,名师推荐
文章目录 一.NUXT前台环境搭建 1.如何学习NUXT 2.下载安装使用NUXT入门模板starter-template 3.机制 二.编写静态页面 1.设置布局(首尾固定,中间用nuxt引用组件) ...
- android首页新颖,Android仿转转首页banner
banner_g--.gif 效果由来 我司设计一向比较喜欢高大上的东西(我也喜欢...),无意中看到转转首页banner动画不错,想得之,由于项目工期和人手限制,遭到IOS开发和我的强烈反对,设计也 ...
- xbanner 动画特效设置android,Axure教程:如何实现爱彼迎App首页Banner的切换效果
原标题:Axure教程:如何实现爱彼迎App首页Banner的切换效果 本文分享一个用Axure实现爱彼迎App首页Banner切换效果的方法,供大家参考,欢迎一起交流. 作者最近闲暇时间试着将爱彼迎 ...
- 网站首页banner的高度计算
很快一周又过去了 这周收获到的,工作中的知识点总结 一, 网站首页banner的高度计算 网站首页在设计banner的高度的时候,需要保证一进入页面的时候,屏幕至少能显示一半出来,也就是说banner ...
- 游戏陪玩源码开发,仿某看书app首页Banner轮播+背景渐变
在游戏陪玩源码开发时,会设计到很多UI界面设计,其中首页Banner轮播就很重要,最近发现一个比较有意思的效果图,于是想自己操作实践下.效果图如下: 作者实现的效果: 1. 游戏陪玩源码开发,仿某看书 ...
- 微擎模块 抖音口红机 3.2.0+wap登陆1.3.0增加首页banner跳转链接
此版本是正版打包 加密模块 安装sg11加密 版本号:3.2.0 - H5版 10:46 1.增加首页banner跳转链接2.增加每天领取余额功能3.修复虚假会员添加功能4.优化 下载地址 http: ...
- 首页banner广告图片轮换超炫效果代码
原文:首页banner广告图片轮换超炫效果代码 源代码下载地址:http://www.zuidaima.com/share/1745329876454400.htm 兼容IE.火狐.谷歌.360.猎豹 ...
- Android仿淘宝、京东Banner滑动查看图文详情
文章目录 写在前面 效果图 原理分析 核心代码 源码地址 写在前面 本文基于 ViewPager2 实现的 Banner 效果,进而实现了仿淘宝.京东Banner滑动至最后一页时继续滑动来查看图文详情 ...
- 模仿东京首页banner轮播,京东新闻上下滚动动画实现(动画实现)
接着上篇 微信小程序-阅读小程序demo写:http://www.cnblogs.com/muyixiaoguang/p/5917986.html 首页banner动画实现 京东新闻上下动画实现 想着 ...
- 记一次用canvas做出腾讯云首页banner流光效果的经历
demo实现:线上效果 -------------------------- ↑↑↑以上正文 = v = ↑↑↑ -------------------------- ↓↓↓以下废话 =.= ...
最新文章
- 网络编程五种IO模型之poll模型
- easyUI的图标设置
- 课后作业-结对编程项目总结
- 学习Caffe(二)使用Caffe:Caffe加载模型+Caffe添加新层+Caffe finetune
- ASP.NET Core 3.x - Endpoint Routing 路由体系的内部机制
- Oracle 常用命令举例
- MySQL使用技巧收集,持续更新中......
- 【C++学习】C++中的强制转换
- 【博士招生】卢森堡大学​SnT(CVI²)研究小组,DeepFake 检测领域
- 怎样查阅电脑最大能够扩充多大的内存
- UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 24: invalid start byte
- SpringBoot整合Kotlin构建Web服务
- matlab中怎么计算信噪比,如何计算通信中的信噪比SNR
- 计算机网络未识别网络,电脑网络出现未识别的网络,无Internet访问的解决办法...
- 蓝桥杯省赛真题2016题解
- 剪枝计算机,α-β剪枝 - 电脑黑白棋 - 黑白棋天地
- Vue3大菠萝pinia笔记
- Java程序员必看经典书籍,助你早日打通任督二脉,Java菜鸟教程视频
- linux java 串口_Java串口通信总结
- webStrom 2018 激活破解(最新)