viewpage轮播图
<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轮播图的更多相关文章
- Android ViewPager轮播图
Android客户端开发中很多时候需要用到轮播图的方式进行重点新闻的推送或者欢迎页面的制作,下面这个轮播图效果的Deamo来自互联网再经过修改而成. 1.布局文件activity_main.xml中添 ...
- android 轮播图
轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考 目前测试图片为mipmap中的图片 没有写从网络加载 ...
- Android轮播图
轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考目前测试图片为mipmap中的图片 没有写从网络加载图 ...
- Android 轮播图Banner切换图片的效果
Android XBanner使用详解 2018年03月14日 08:19:59 AND_Devil 阅读数:910 版权声明:本文为博主原创文章,未经博主允许不得转载. https://www. ...
- Flutter学习五之网络请求和轮播图的实现
上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢?官方使用的是dart io中的HttpClient发起的请求,但HttpCl ...
- js 基础篇(点击事件轮播图的实现)
轮播图在以后的应用中还是比较常见的,不需要多少行代码就能实现.但是在只掌握了js基础知识的情况下,怎么来用较少的而且逻辑又简单的方法来实现呢?下面来分析下几种不同的做法: 1.利用位移的方法来实现 首 ...
- 实现下来ScrollView放大轮播图
创建工程,创建一个UIScrollView属性,并遵循其协议: #define kWidth self.view.frame.size.width//屏幕宽 #define kHeight self. ...
- ViewPager轮播图
LoopViewPagerLayout无限轮播 项目地址:https://github.com/why168/LoopViewPagerLayout 支持三种动画: 支持修改轮播的速度: 支持修改滑动 ...
- CSS-用伪类制作小箭头(轮播图的左右切换btn)
先上学习地址:http://www.htmleaf.com/Demo/201610234136.html 作者对轮播图左右按钮的处理方法一改往常,不是简单地用btn.prev+btn.next的图片代 ...
随机推荐
- ZooKeeper学习(二)ZooKeeper实现分布式锁
一.简介 在日常开发过程中,大型的项目一般都会采用分布式架构,那么在分布式架构中若需要同时对一个变量进行操作时,可以采用分布式锁来解决变量访问冲突的问题,最典型的案例就是防止库存超卖,当然还有其他很多 ...
- python中生成随机整数(random模块)
1.从一个序列中随机选取一个元素返回: random.choice(sep) 2.用于将一个列表中的元素打乱 random.shuffle(sep) 3.在sep列表中随机选取k个 ...
- React手稿之State Hooks of Hooks
React Hooks React在16.7.0-alpha.0版本中提到了Hooks的概念,目前还是Proposal阶段. 官方也陈述,接下来的90%的工作会投入到React Hooks中. 从目前 ...
- 细嚼JS闭包知识点及案例分析
闭包是js开发惯用的技巧,什么是闭包? 闭包指的是:能够访问另一个函数作用域的变量的函数.清晰的讲:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量.默认闭包的this指向windows. ...
- python3 连接数据库~
~目前记录的是针对python3写的数据库连接,不适用于pyhon2.python3如果想要与数据库进行连接,则需要先下载对应各数据库的插件包,然后导入包.python3的插件下载地址:https:/ ...
- 015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码
015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码 本文知识点:Unicode编码以及字符如何表示? ASCII码是美国提出的标准信息 ...
- 为自己的网页博客添加L2Dwidget.js看板娘
如果是博客园,直接在设置-->页脚 HTML 代码,加上下面代码: 1 <!-- L2Dwidget.js L2D网页动画人物 --> 2 <script src=" ...
- 系统编程-文件IO-IO处理方式
IO处理五种模型 .
- K8S基础
四组基本概念 Pod/Pod控制器 Name/Namespace Label/Label选择器 Service/Ingress Pod Pod是k8s里能够被运行的最小的逻辑单元(原子单元) 1个Po ...
- spring-boot-route(十五)整合RocketMQ
RocketMQ简介 RocketMQ是阿里巴巴开源的消息中间件.目前已经贡献给Apache软件基金会,成为Apache的顶级项目. rocketMQ基本概念 1. Producer Group 生产 ...