Android应用之广告轮播view, 自动循环轮播
来源:互联网 发布:cf显示网络异常win7 编辑:程序博客网 时间:2024/05/23 14:04
1、效果图:
功能:自动轮播,循环轮播。
2、代码:
view源码:
CarouselViewPager.java
package exam.org.jsc.password.view;import android.content.Context;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;import android.widget.RelativeLayout;import java.util.ArrayList;import java.util.List;import exam.org.jsc.password.R;/** * Created by jsc on 2016/11/8. */public class CarouselViewPager extends RelativeLayout{ private final String TAG = "CarouselViewPager"; private final int MESSAGE_ID = 0x10; private ViewPager mViewPager; private LinearLayout mIndicator; private List<View> mItemViews = new ArrayList<>(); private List<View> mIndicatorViews = new ArrayList<>(); private int size = 0; private boolean isCloned = false; private CarouselPagerAdapter adapter; private LinearLayout.LayoutParams params; private boolean isAutoScrolling = false; private int itemLayout; public CarouselViewPager(Context context) { this(context, null); } public CarouselViewPager(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CarouselViewPager(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context){ inflate(context, R.layout.carousel_view_pager, this); mViewPager = (ViewPager) findViewById(R.id.view_pager); mIndicator = (LinearLayout) findViewById(R.id.indicator); mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { selectedIndicator(isCloned ? (position % (size / 2)) : (position % size)); } @Override public void onPageScrollStateChanged(int state) { } }); int dp4 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics()); int dp8 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()); params = new LinearLayout.LayoutParams(0, 0); params.setMargins(dp4, dp4, dp4, dp4); params.width = dp8; params.height = dp8; } public void setItemLayout(int itemLayout) { this.itemLayout = itemLayout; } /** * * @param data * @param isCloned data是否clone过。clone规则:例如[0, 1], clone之后应该是这样[0, 1, 0, 1]。 * @param selectedIndex 默认选中的item。 * @param onLoadItemViewListener 图片加载器。 * @param <T> */ public <T>void setData(List<T> data, boolean isCloned, int selectedIndex, OnLoadItemViewListener<T> onLoadItemViewListener){ this.isCloned = isCloned; //清空之前的记录 if (adapter != null) adapter.setViews(new ArrayList<View>()); mIndicator.removeAllViews(); mItemViews.clear(); mIndicatorViews.clear(); if (data == null || data.size() == 0){ size = 0; return; } if (itemLayout == 0) throw new IllegalArgumentException("You must call method setItemLayout(int itemLayout) first."); size = data.size(); if (size == 2 && !isCloned) throw new IllegalArgumentException("You must clone the data."); int indicatorLen = size; if (isCloned) indicatorLen = size / 2; //indicator for (int i = 0; i < indicatorLen; i++) { View view = new View(getContext()); view.setBackgroundResource(R.drawable.indicator_selector); view.setTag(i); mIndicator.addView(view, i, params); mIndicatorViews.add(view); } //item for (int j = 0; j < size; j++) { View itemView = LayoutInflater.from(getContext()).inflate(itemLayout, null); T item = data.get(j); itemView.setTag(item); if (onLoadItemViewListener != null) onLoadItemViewListener.onLoadItemView(itemView, item); mItemViews.add(j, itemView); } adapter = new CarouselPagerAdapter(mItemViews); mViewPager.setAdapter(adapter); if (selectedIndex < 0) selectedIndex = 0; selectedIndicator(isCloned ? (selectedIndex % (size / 2)) : (selectedIndex % size)); mViewPager.setCurrentItem((100 / size * size + selectedIndex) % size); stopAutoScroll(); startAutoScroll(); } private void selectedIndicator(int selectedIndex){ for (int i = 0; i < mIndicatorViews.size(); i++) { if (i == selectedIndex) mIndicatorViews.get(i).setSelected(true); else mIndicatorViews.get(i).setSelected(false); } } private void startAutoScroll(){ if (size <= 1) return; if (!isAutoScrolling){ mHandler.sendEmptyMessageDelayed(MESSAGE_ID, 3 * 1000); isAutoScrolling = true; } } private void stopAutoScroll(){ if (isAutoScrolling){ mHandler.removeMessages(MESSAGE_ID); isAutoScrolling = false; } } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what == 0x10){ int cur = mViewPager.getCurrentItem(); cur ++; mViewPager.setCurrentItem(cur, true); sendEmptyMessageDelayed(MESSAGE_ID, 3 * 1000); } } }; @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); } public void onResume(){ startAutoScroll(); } public void onPause(){ stopAutoScroll(); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent event) { Log.i(TAG, "onTouch-->event: " + event.getAction()); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: stopAutoScroll(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: startAutoScroll(); break; } return super.dispatchTouchEvent(event); } public interface OnLoadItemViewListener<T>{ void onLoadItemView(View itemView, T item); } class CarouselPagerAdapter extends PagerAdapter { List<View> views = new ArrayList<>(); int viewSize = 0; public CarouselPagerAdapter(List<View> views) { this.views = views; viewSize = views.size(); } public void setViews(List<View> views) { this.views = views; viewSize = views.size(); notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return viewSize <= 1 ? viewSize : Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { if (viewSize <= 1) return; container.removeView(views.get(position % viewSize)); } /** * 载入图片进去,用当前的position 除以 图片数组长度取余数是关键 */ @Override public Object instantiateItem(ViewGroup container, int position) { int realPos = viewSize < 2 ? position : position % viewSize; Log.i(TAG, "instantiateItem pos = " + realPos); View view = views.get(realPos); if (view.getParent() == null){ container.addView(view); } return view; } }}
carousel_view_pager.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="120dp"> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/indicator" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" android:layout_marginBottom="@dimen/activity_vertical_margin"/></FrameLayout>
drawable文件夹
indicator_selector.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true"> <shape android:shape="oval"> <solid android:color="#FF4081"/> </shape> </item> <item > <shape android:shape="oval"> <solid android:color="#FFFFFF"/> </shape> </item></selector>
3、使用:
界面调用
CarouselViewPagerActivity.java
package exam.org.jsc.password.activity;import android.graphics.Color;import android.os.Bundle;import android.view.View;import android.widget.TextView;import java.util.ArrayList;import java.util.List;import java.util.Random;import exam.org.jsc.password.R;import exam.org.jsc.password.view.CarouselViewPager;public class CarouselViewPagerActivity extends BaseActivity { private CarouselViewPager mCarouselViewPager; int[] colors = { Color.BLACK, Color.BLUE, Color.YELLOW, Color.GREEN, Color.CYAN, Color.RED }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_carousel_view_pager); setStatusBarBackground(); initTitleBar("CarouselViewPager", new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); mCarouselViewPager = (CarouselViewPager) findViewById(R.id.carousel_view_pager); mCarouselViewPager.setItemLayout(R.layout.carousel_item_layout); List<MyModel> data = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 5; i++) { MyModel myModel = new MyModel(); myModel.label = "position : " + i; myModel.color = colors[random.nextInt(colors.length)]; data.add(myModel); } mCarouselViewPager.setData(data, false, 0, new CarouselViewPager.OnLoadItemViewListener<MyModel>() { @Override public void onLoadItemView(View itemView, MyModel item) { View view = itemView.findViewById(R.id.iv_pic); view.setBackgroundColor(item.color); } }); } @Override protected void onResume() { super.onResume(); mCarouselViewPager.onResume(); } @Override protected void onPause() { super.onPause(); mCarouselViewPager.onPause(); } class MyModel { String label; int color; }}
界面布局文件
activity_carousel_view_pager.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main2" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="exam.org.jsc.password.activity.AboutActivity"> <include layout="@layout/title_bar" /> <exam.org.jsc.password.view.CarouselViewPager android:id="@+id/carousel_view_pager" android:layout_width="match_parent" android:layout_height="wrap_content"/></LinearLayout>
适配器itemView
carousel_item_layout.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="120dp"> <ImageView android:id="@+id/iv_pic" android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>
谢谢您的惠顾,code有不足的地方请在评论里回复(或者联系我)。
QQ:1006368252
0 0
- Android应用之广告轮播view, 自动循环轮播
- 自动平滑轮播、左右循环view
- Android 实现广告Banner循环轮播
- Android 实现广告Banner循环轮播
- Android轮播广告
- Android广告轮播
- Android之本地图片轮播(广告轮播)
- android 图片轮播(自动循环轮播)
- android的自动播放和伪无限循环的广告轮播实现
- 商城之轮播广告
- ANDROID轮播广告图片
- Android自定义轮播广告
- android Banner 广告轮播
- Android无限广告轮播
- Android无限广告轮播
- Android Viewpager3D广告轮播
- Android无限广告轮播
- Android ViewPager广告轮播
- zstu4266-回文
- UML之序列图
- 实验室智能管理系统(2)——Arm+QT部分(二)
- JDBC为什么要使用PreparedStatement而不是Statement
- LeetCode005 Longest Palindromic Substring
- Android应用之广告轮播view, 自动循环轮播
- 【UESTC 1510 渐变字符串】 + 贪心
- error while loading shared libraries
- js正则表达exec与match的区别
- 【GoF】工厂方法-再理解
- zstu-4269买iphone
- 剑指Offer 26 复杂链表的复制
- 广东工业大学第12届ACM程序设计大赛 Problem H: tmk买礼物
- OpenCV+Qt+Win10开发环境配置