android 自定义轮播广告控件ViewPager——自定义控件学习(四)
来源:互联网 发布:网络流行语沙发的含义 编辑:程序博客网 时间:2024/04/29 02:23
android 自定义轮播广告控件ViewPager——自定义控件学习(四)
前面已经介绍过基于ViewFlipper的自定义控件了,现在要基于ViewPager制作一个图片轮播广告控件。如果想了解以前不是自定义方式的话,请看:android ViewPager轮播制作成品——轮播制作(六)。如果想看看基于ViewFlipper实现轮播广告控件和以看看这个:android 自定义ViewFlipper轮播广告控件——自定义控件学习(二)。
好啦,下面上货。
1、首先是主要的CustomerViewPagerComponent.java
package com.example.administrator.customerviewpagercomponent;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.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2016-09-26. */public class CustomerViewPagerComponent extends RelativeLayout implements ViewPager.OnPageChangeListener { private final int MAX_COUNT = 10000; private final int TIME_INTERVAL = 5000; public final int MSG_CODE = 0x986; private int[] imgs; private ImageView[] imageViews; private ViewPager viewPager; private LinearLayout linearLayout; private List<View> dots; private boolean autoPlayFlag; private int currentNumber; public void setImgs(int[] imgs) { this.imgs = imgs; if (imgs != null) { imageViews = new ImageView[imgs.length]; for (int i = 0; i < imgs.length; i++) { imageViews[i] = new ImageView(getContext()); imageViews[i].setImageResource(imgs[i]); imageViews[i].setScaleType(ImageView.ScaleType.FIT_XY); } // 设置适配器 viewPager.setAdapter(new MyAdapter()); //设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动 currentNumber = (imageViews.length) * 100; viewPager.setCurrentItem(currentNumber); //设置监听器 viewPager.setOnPageChangeListener(this); //开始自动播放 Message message = handler.obtainMessage(MSG_CODE); handler.sendMessageDelayed(message, TIME_INTERVAL); //设置点点 setDot(currentNumber); } } //构造 public CustomerViewPagerComponent(Context context, AttributeSet attrs) { super(context, attrs); viewPager = new ViewPager(getContext()); viewPager.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); addView(viewPager); autoPlayFlag = true; } //设置ViewPager的适配器 public class MyAdapter extends PagerAdapter { @Override public int getCount() { return MAX_COUNT; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(imageViews[position % imageViews.length]); } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(imageViews[position % imageViews.length], 0); return imageViews[position % imageViews.length]; } } public Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == MSG_CODE) { if (autoPlayFlag) { showNext(); } Message message = handler.obtainMessage(MSG_CODE); handler.sendMessageDelayed(message, TIME_INTERVAL); } } }; public void showNext() { currentNumber++; viewPager.setCurrentItem(currentNumber); //设置点点 setDot(currentNumber); } public void showPrevious() { currentNumber--; viewPager.setCurrentItem(currentNumber); //设置点点 setDot(currentNumber); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { currentNumber = position; //设置点点 setDot(currentNumber); } @Override public void onPageScrollStateChanged(int state) { switch (state) { case ViewPager.SCROLL_STATE_IDLE: //无动作、初始状态 Log.i("---->",ViewPager.SCROLL_STATE_IDLE +" SCROLL_STATE_IDLE"); break; case ViewPager.SCROLL_STATE_DRAGGING: //点击、滑屏 Log.i("---->",ViewPager.SCROLL_STATE_DRAGGING +" SCROLL_STATE_DRAGGING"); autoPlayFlag = false; break; case ViewPager.SCROLL_STATE_SETTLING: //释放 Log.i("---->",ViewPager.SCROLL_STATE_SETTLING +" SCROLL_STATE_SETTLING"); autoPlayFlag = true; break; } } //设置当前选中的点点 private void setDot(int currentNumber) { //remove removeView(linearLayout); //设置点点 linearLayout = new LinearLayout(getContext()); RelativeLayout.LayoutParams reLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); reLayoutParams.setMargins(0, 0, 0, 30); reLayoutParams.addRule(ALIGN_PARENT_BOTTOM); linearLayout.setLayoutParams(reLayoutParams); linearLayout.setOrientation(LinearLayout.HORIZONTAL); linearLayout.setGravity(Gravity.RIGHT); addView(linearLayout); dots = new ArrayList<View>(); //设置当前选中 int current = currentNumber % imgs.length; for (int i = 0; i < imgs.length; i++) { View view = new View(getContext()); if (current == i) { view.setBackgroundResource(R.drawable.dot_focused); } else { view.setBackgroundResource(R.drawable.dot_normal); } LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams(30, 30); layoutparams.setMargins(5, 0, 5, 0); view.setLayoutParams(layoutparams); linearLayout.addView(view); } }}
2、需要的资源:
dot_focused.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#FEF400"></solid></shape>
dot_normal.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#437DA0"></solid></shape>
3、调用,在布局文件中添加:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.customerviewpagercomponent.MainActivity"> <com.example.administrator.customerviewpagercomponent.CustomerViewPagerComponent android:layout_width="match_parent" android:id="@+id/customerViewPager" android:layout_marginTop="10dp" android:layout_height="200dp"></com.example.administrator.customerviewpagercomponent.CustomerViewPagerComponent></RelativeLayout>
4、在MainActivity.java中设置:
package com.example.administrator.customerviewpagercomponent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity { private CustomerViewPagerComponent customerViewPagerComponent; private int[] imgs = new int[]{ R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4 }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); customerViewPagerComponent = (CustomerViewPagerComponent)this.findViewById(R.id.customerViewPager); customerViewPagerComponent.setImgs(imgs); } @Override protected void onDestroy() { customerViewPagerComponent.handler.removeMessages(customerViewPagerComponent.MSG_CODE); super.onDestroy(); }}
注意:在MainActivity.java中一定要在onDestroy把message释放,否则再次打开程序会出现程序闪退的问题,详细请看android ViewPager自动播放OOM处理——轮播制作(五)
运行结果:
最后附上代码:点我下载,不要你的积分哦!!!
0 0
- android 自定义轮播广告控件ViewPager——自定义控件学习(四)
- android 自定义ViewFlipper轮播广告控件——自定义控件学习(二)
- android 自定义ViewAnimator文字轮播广告控件——自定义控件学习(三)
- Android学习(40) -- 自定义控件(4)广告轮播(ViewPager)
- 自定义控件(二)--广告轮播
- 自定义广告轮播控件(基于ViewPager),带指示器,一键引用
- Android自定义控件BannerLayout,实现广告轮播
- 自定义控件--广告条(ViewPager)
- Android--自定义控件(图片轮播)
- Android自定义图片轮播控件
- Android自定义控件之大图轮播
- 自定义Android图片轮播控件
- Android 自定义轮播图片控件使用
- Android自定义控件实现无限轮播
- Android自定义轮播广告
- Android自定义控件 之 轮播图(ViewPager)重点及学习
- android 自定义控件(四)自定义进度条
- Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View
- Android4.3 Bluetooth 抓取hci log
- matlab-自控原理 二阶纯数字矩阵求逆矩阵
- js document.body.onload报错
- matlab-自控原理 已知A矩阵求线性定常系统的矩阵指数函数
- 基于NodeJs的Express及Webuploader实现大文件分片上传与合并(一)
- android 自定义轮播广告控件ViewPager——自定义控件学习(四)
- 早研
- 浅谈几种Android 进程间通信
- Java 中基本类型和字符串之间的转换
- 人生中的第三个程序
- 小话设计模式(八)装饰模式
- C++静态库与动态库
- yii的relations方法的使用
- matlab-自控原理 已知x~=Ax+Bu中的AB矩阵和X0,求单位输入下的时间响应