<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. jfinal3连接sqlserver2012 保存日期字段出现“不支持从 UNKNOWN 到 UNKNOWN 的转换”错误

    修改Dialect中的fillStatement方法,增加判断日期类型并转换为时间戳

  2. Bottleneck靶机渗透

    Bottleneck 端口扫描,主机发现. 敏感目录为:http://192.168.114.165/image_gallery.php 在该目录下发现:http://192.168.114.165/ ...

  3. package.json 非官方字段集合

    package.json 非官方字段集合 package.json 官方字段请参考 https://docs.npmjs.com/files/package.json.下面介绍的是非官方字段,也就是各 ...

  4. 使用maven整合mybatis时出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    分析原因是mybatis的映射文件的问题,首先进行分析排查: 1.检查mapper接口和对应的xml文件的包名是否对应 2.检查xml文件的namespace与mapper接口的包名是否对应 3.检查 ...

  5. 001 win10下安装linux子系统--Ubuntu及其图形界面

    首次启动图形界面关键步骤及相关命令: 步骤: 打开Xlunch 打开XLaunch,选择:"one large window",Display number设置成0,其它默认即可, ...

  6. DORIS系统概述

    DORIS(Doppler Orbitography and Radio-positioning Integrated by Satellite)(多普勒轨道学与无线电定位集成卫星),它是由法国Cne ...

  7. ISCSI共享

    共享存储 ISCSI共享 服务端 软件安装 Install epel-release: # yum install epel-release Install scsi-target-utils rpm ...

  8. 2014年 实验五 Internet与网络工具的使用

    实验五 Internet与网络工具的使用 [实验目的]   ⑴.FTP服务器的架设和客户端的使用. ⑵.使用云盘和云笔记应用 ⑶.运用QQ的远程协助功能. (4).默认安装foxmail软件,进行邮件 ...

  9. main函数标准写法

    main函数签名 C++中允许两种格式,带参数的和不带参数的: int main() int main(int argc, const char* argv[]) 和C标准不同,C++中main函数必 ...

  10. 测试-python相关

    python基础 一行代码实现1~100累加,不使用for循环 方式一: sum(range(1,101)) 方式二: 1 from functools import reduce 2 reduce( ...