android防新闻循环轮播图效果
来源:互联网 发布:互联网企业 知乎 编辑:程序博客网 时间:2024/06/18 04:22
前天有朋友问我说实现类似新闻轮播图片的效果该怎么实现?有什么框架比较好一点。我想这不用什么框架,自己写一个就可以实现吧!好了,废话不多说,先看一下实现的效果图,再上代码。
实现的效果图
activity_main.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:id="@+id/viewPager" android:layout_height="match_parent"/> <LinearLayout android:layout_width="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true" android:id="@+id/circleLayout" android:gravity="center" android:paddingBottom="30dp" android:layout_centerHorizontal="true" android:layout_height="wrap_content"> </LinearLayout> </RelativeLayout></RelativeLayout>ScrollPagerAdapter.javapublic class ScrollPagerAdapter extends PagerAdapter { private Context context; private int[] mIamgeId; private ImageView[] mImageViews; public ScrollPagerAdapter(Context context, int[] mIamgeId) { this.mIamgeId = mIamgeId; this.context = context; mImageViews = new ImageView[mIamgeId.length]; for (int i = 0; i < mIamgeId.length; i++) {//通过传进来的图片数量来确定给父布局添加多少个子布局ImageView来显示图片 mImageViews[i] = new ImageView(context); } } @Override public int getCount() { return Integer.MAX_VALUE;//这个值需要设置为这个,如果只是设置为mIamgeId.length,那么久无法实现循环滚动 } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { position = (position) % mIamgeId.length; ImageView iv = new ImageView(context); iv.setScaleType(ImageView.ScaleType.FIT_XY); iv.setImageResource(mIamgeId[position]); container.addView(iv);//装载对应的ImageVIew return iv; }}MainActivity.javapublic class MainActivity extends Activity { private ViewPager mViewPager; private LinearLayout mCircleLayout;//存放滚动时小圆点的父布局 private int[] mImageId = new int[]{R.mipmap.one, R.mipmap.two, R.mipmap.three, R.mipmap.four};//存放图片id的数组 private ScrollPagerAdapter mScrollPagerAdapter;//ViewPager的适配器 private Context mContext; private int mPreviousEnabledPointPosition;//记录上一张显示图片的位置 private PersonalHandler mHandler; //消息处理器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; initView();//初始化view drawRadious();//给mCircleLayout布局绘制对应的圆点,通过图片的数量来绘制对应圆点的数目 startRunImage();//开始轮播条滚动 } //初始化View private void initView() { mViewPager = (ViewPager) findViewById(R.id.viewPager); mCircleLayout = (LinearLayout) findViewById(R.id.circleLayout); mScrollPagerAdapter = new ScrollPagerAdapter(mContext, mImageId); mViewPager.setAdapter(mScrollPagerAdapter); } //给mCircleLayout布局绘制对应的圆点,通过图片的数量来绘制对应圆点的数目 private void drawRadious() { //进行小圆点的绘制 mCircleLayout.removeAllViews(); View v; LinearLayout.LayoutParams params; int size = mImageId.length; for (int i = 0; i < size; i++) { v = new View(mContext); v.setBackgroundResource(R.drawable.scroll_point_bg); params = new LinearLayout.LayoutParams(15, 15); if (i != 0) { params.leftMargin = 10; } v.setLayoutParams(params); v.setEnabled(false); mCircleLayout.addView(v); } mPreviousEnabledPointPosition = 0; mCircleLayout.getChildAt(mPreviousEnabledPointPosition).setEnabled(true); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { position = position % mImageId.length; mCircleLayout.getChildAt(mPreviousEnabledPointPosition).setEnabled(false); mCircleLayout.getChildAt(position).setEnabled(true); mPreviousEnabledPointPosition = position; } @Override public void onPageScrollStateChanged(int state) { } }); } //开始轮播条滚动 private void startRunImage() { if (mHandler == null) { mHandler = new PersonalHandler(); } else { // 把队列中的所有的消息和任务全部清除出队列 mHandler.removeCallbacksAndMessages(null); } // 延时3秒钟, 执行PersonalRunnable任务类中的run方法 mHandler.postDelayed(new PersonalRunnable(), 3000); } //消息处理器 private class PersonalHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 当前是在主线程中, 把轮播图切换到下一页面 int currentItem = (mViewPager.getCurrentItem() + 1) % mImageId.length; mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1); // 递归: postDelayed -> PersonalRunnable.run -> sendEmptyMessage -> handleMessage mHandler.postDelayed(new PersonalRunnable(), 3000); } } private class PersonalRunnable implements Runnable { @Override public void run() { mHandler.sendEmptyMessage(0); } }}
1 0
- android防新闻循环轮播图效果
- 防网易新闻频道右侧新闻滚动效果
- 新闻列表上下循环滚动效果
- android单向无限循环的轮播图效果。
- Android实现腾讯新闻的新闻类别导航效果
- Android高仿京东垂直循环滚动新闻栏
- jquery实现的向上无缝循环滚动的新闻效果
- 新闻循环
- Android实现网易新闻客户端效果
- Android新闻客户端水平导航条效果
- Android 上下滚动的新闻效果
- Android实现新闻效果原来如此简单
- android listview实现新闻列表展示效果
- android高仿京东快报(垂直循环滚动新闻栏)
- android高仿京东快报(垂直循环滚动新闻栏)
- 模仿android网易新闻客户端左右动画效果
- Android高仿网易新闻顶部滑动条效果
- Android网易新闻评论盖楼效果的实现
- MacOS 中使用 [dd] 指令烧录 ISO 镜像到 U 盘
- Delphi中把bmp图片转换成jpg图片
- 【HDU】-1155-Bungee Jumping(物理)
- 解决 Cookie 中文存储异常
- dir.php
- android防新闻循环轮播图效果
- UVa1589 ACM/ICPC 2011 象棋
- 自定义 View 实现类似京东、天猫收件地址的信封分割线控件
- 从零基础接触java第五周第一节
- [git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF
- 计算访问量.php
- remove.php
- 双向队列
- 2016中国大学生程序设计竞赛网络选拔赛