<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="160dp" > <androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <LinearLayout android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:background="#66000000"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="5dp"
app:layout_constraintBottom_toBottomOf="@+id/viewpager"> <TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="社会"
android:textColor="@android:color/white" />
<LinearLayout
android:id="@+id/ll_point_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {

    private ViewPager viewPager;
private int[] imageResIds;
private ArrayList<ImageView> imageViewList;
private ArrayList<View> pointViews;
private LinearLayout ll_point_container;
private String[] contentDesc;
private TextView tv_desc;
private int lastEnablePoint = 0;
private boolean isRunning = true;
private Handler handler;
private Runnable runnable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 初始化布局 View 视图
initViews(); // Model 数据
initData(); // Controller 控制器
initAdapter();
//1.
handler = new Handler();
runnable= new Runnable() {
@Override
public void run() { viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
handler.postDelayed(this, 2000);
} }; //2
// mTimer.schedule(mTimerTask, 2000, 2000);
//3
// handler.postDelayed( runnable, 2000 );
//开启轮询
// new Thread() {
// public void run() {
// while(isRunning) {
// try {
// Thread.sleep(2000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// //往下跳一位
// runOnUiThread(new Runnable() {
// @Override
// public void run() {
// viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
// }
// });
// }
//
// }
// }.start(); } @Override
protected void onPause() {
super.onPause();
handler.removeCallbacksAndMessages( null ); } @Override
protected void onResume() {
super.onResume();
handler.postDelayed( runnable, 2000 );
} @Override
protected void onDestroy() {
super.onDestroy();
isRunning = false;
} private void initViews() {
viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setOnPageChangeListener(this);// 设置滚动更新 viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
handler.removeCallbacksAndMessages( null );
break;
case MotionEvent.ACTION_UP:
handler.postDelayed( runnable, 2000 );
break;
}
return false;
}
});
tv_desc = (TextView) findViewById(R.id.tv_desc); ll_point_container = findViewById(R.id.ll_point_container); } private void initAdapter() {
ll_point_container.getChildAt(0).setEnabled(true);
tv_desc.setText(contentDesc[0]);
// 设置适配器
viewPager.setAdapter(new MyAdapter()); //默认设置到中间的某个位置
int pos = Integer.MAX_VALUE / 2;
//viewPager.setCurrentItem(pos - 3);
viewPager.setCurrentItem(0);
} private void initData() { // 初始化要显示的数据
// 图片资源id数组
imageResIds = new int[] { R.drawable.lunbo1, R.drawable.lunbo2, R.drawable.lunbo3,
R.drawable.lunbo4};
// 文本描述
contentDesc = new String[] { "巩俐不低俗,我就不能低俗", "朴树又回来啦!再唱经典老歌引万人大合唱",
"揭秘北京电影如何升级", "乐视网TV版大派送", "热血屌丝的反杀" };
imageViewList = new ArrayList<ImageView>();
pointViews = new ArrayList<View>();
ImageView imageView;
View pointView;
LinearLayout.LayoutParams layoutParams;
for (int i = 0; i < imageResIds.length; i++) {
imageView = new ImageView(this);
imageView.setBackgroundResource(imageResIds[i]);
imageViewList.add(imageView); // 加小白点,指示器
pointView = new View(this);
pointView.setBackgroundResource(R.drawable.select);
layoutParams = new LinearLayout.LayoutParams(7, 7);
if (i != 0) {
layoutParams.leftMargin = 10;
}
pointView.setEnabled(false); ll_point_container.addView(pointView, layoutParams);
} } class MyAdapter extends PagerAdapter { @Override
public int getCount() {
return Integer.MAX_VALUE;
} // 3、指定复用的判断逻辑
@Override
public boolean isViewFromObject(View view, Object object) {
// 当滑到新的条目,又返回来,view是否可以被复用
return view == object;
} // 1、返回要显示的条目内容,创建条目
@Override
public Object instantiateItem(ViewGroup container, int position) {
// container:容器:ViewPager
// position:当前要显示的条目的位置
position = position % 4; ImageView imageView = imageViewList.get(position); // a、把view对象添加到container中
container.addView(imageView);
// b、把view对象返回给框架,适配器
return imageView; // 必须要重写,否则抛异常
} // 2、销毁条目
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// object 要销毁的对象
container.removeView((View) object);
} } @Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) { // 滚动时调用
} @Override
public void onPageSelected(int position) {
// 新条目被选中时调用
position = position % 4; tv_desc.setText(contentDesc[position]);
// 把之前的禁用,把最新的启用
ll_point_container.getChildAt(lastEnablePoint).setEnabled(false);
ll_point_container.getChildAt(position).setEnabled(true);
lastEnablePoint = position;
} @Override
public void onPageScrollStateChanged(int state) {
// 滚动状态变化时调用 }
}
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >

    <corners android:radius="5dp" />
<solid android:color="@android:color/white" /> </shape>
<shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="oval" >

    <corners android:radius="5dp" />
<solid android:color="@android:color/darker_gray" /> </shape>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:drawable="@drawable/shap1"></item>
<item android:state_enabled="false" android:drawable="@drawable/shap2"></item>
</selector>

viewpage轮播图的更多相关文章

  1. Android ViewPager轮播图

    Android客户端开发中很多时候需要用到轮播图的方式进行重点新闻的推送或者欢迎页面的制作,下面这个轮播图效果的Deamo来自互联网再经过修改而成. 1.布局文件activity_main.xml中添 ...

  2. android 轮播图

    轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考 目前测试图片为mipmap中的图片 没有写从网络加载 ...

  3. Android轮播图

    轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考目前测试图片为mipmap中的图片 没有写从网络加载图 ...

  4. Android 轮播图Banner切换图片的效果

    Android XBanner使用详解 2018年03月14日 08:19:59 AND_Devil 阅读数:910   版权声明:本文为博主原创文章,未经博主允许不得转载. https://www. ...

  5. Flutter学习五之网络请求和轮播图的实现

    上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢?官方使用的是dart io中的HttpClient发起的请求,但HttpCl ...

  6. js 基础篇(点击事件轮播图的实现)

    轮播图在以后的应用中还是比较常见的,不需要多少行代码就能实现.但是在只掌握了js基础知识的情况下,怎么来用较少的而且逻辑又简单的方法来实现呢?下面来分析下几种不同的做法: 1.利用位移的方法来实现 首 ...

  7. 实现下来ScrollView放大轮播图

    创建工程,创建一个UIScrollView属性,并遵循其协议: #define kWidth self.view.frame.size.width//屏幕宽 #define kHeight self. ...

  8. ViewPager轮播图

    LoopViewPagerLayout无限轮播 项目地址:https://github.com/why168/LoopViewPagerLayout 支持三种动画: 支持修改轮播的速度: 支持修改滑动 ...

  9. CSS-用伪类制作小箭头(轮播图的左右切换btn)

    先上学习地址:http://www.htmleaf.com/Demo/201610234136.html 作者对轮播图左右按钮的处理方法一改往常,不是简单地用btn.prev+btn.next的图片代 ...

随机推荐

  1. mxgraph浅入

    mxgraph浅入 参考文献:https://www.cnblogs.com/xuxg/articles/3246206.html 1.了解 (1)如何判断需要引入mxgraph产品:过程图.工作流和 ...

  2. Linux软件管理常用命令和选项

    rpm /var/lib/rpm:数据库目录 -ivh x:安装软件包x -Uvh x:升级或安装软件包x,如果没有安装x的旧版本,则安装x,否则删除x的旧版本后再安装x. -Fvh x:升级软件包x ...

  3. SpringBoot中pom引入gson异常

    在pom中引入gson依赖,启动spring boot项目中报错 Description:An attempt was made to call the method com.google.gson. ...

  4. 使用Redis做消息队列

    基于内存的单线程数据库,使Redis的线程安全性极高.而Redis的双向链表数据类型(List)天生就可作为消息队列存储消息. 在这里就不说消息队列的等等一些优点.但是补充一下Redis的List类型 ...

  5. 使用 Aria2 代替迅雷

    一.原因 迅雷下载速度一般,thunder:// 开头的链接也逐渐被 bt 链接替代. 迅雷很流氓,安装后 (尤其是 Windows 系统) 浏览器默认使用迅雷下载,对于小文件来说使用浏览器内置下载可 ...

  6. Python中matplotlib.pyplot.imshow画灰度图的多种方法

    转载:https://www.jianshu.com/p/8f96318a153f matplotlib库的教程和使用方法此处就不累赘了,网上有十分多优秀的教程资源.此处直接上代码: def demo ...

  7. The Python Tutorial 和 documentation和安装库lib步骤

    链接: The Python Tutorial : https://docs.python.org/3.6/tutorial/index.html Documentation: https://doc ...

  8. Python 的映射数据类型有哪些?零基础小白入门学习必看

    1 映射类关系 Python 的 collections.abc 模块内拥有 Mapping 和 MutableMapping 这两个抽象基类,它们为 dict 和其他类似的类型提供了接口定义. mu ...

  9. Oracle 数据库创建表空间、创建用户

    创建表空间 create temporary tablespace user_name_temp tempfile '/oradata/ORA11G/user_name_temp.dbf' size ...

  10. 如何解决Win7,win8无法使用DOS的Debug:

    如何解决Win7,win8无法使用DOS的Debug: 安装dosbox 将含有程序link,masm,edit,debug的文件夹masm放到d盘根目录 打开dosbox,输入mount c d:\ ...