Android自定义控件之广告条滚动效果
作者:_江南一点雨 发布时间:2022-01-27 05:57:45
标签:Android,自定义控件,滚动
在一些电子商务网站上经常能够看到一些滚动的广告条,许多软件在首次使用时也有类似的广告条,如图:
其实在github上有实现这种效果的控件,不过这东西做起来也是很简单,我们今天就来看看该怎么做。
先来看看布局文件:
<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.customwidget2.MainActivity" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="200dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dp" >
<TextView
android:id="@+id/image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="淮左名都,竹西佳处,解鞍少驻初程。"
android:textColor="@android:color/white" />
<LinearLayout
android:id="@+id/show_pointer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
></LinearLayout>
</LinearLayout>
</RelativeLayout>
布局文件最上边是一个Viewpager,使用viewpager来实现图片的滚动效果,viewpager下边是一个linearlayout,这个布局文件中有两个东西,一个是textview,这是用来显示下边那一行字的,还有一个linearlayout,这是用来显示字下边的小点,小点的个数我们要根据图片的数量动态添加,所以现在先空着。
MainActivity.java
public class MainActivity extends Activity {
private ViewPager mViewPager;
// 图片都存放在这里
private List<ImageView> imageViewlist;
private ImageView iv;
private TextView imgDes;
// 线程开关,当activity销毁后,线程也应该停止运行
private boolean isStop = false;
private int previousPoint = 0;
// 存放小点的布局文件
private LinearLayout layoutPGroup;
private String[] imageDescription = { "淮左名都,竹西佳处,解鞍少驻初程。", "过春风十里。尽荠麦青青。",
"自胡马窥江去后,废池乔木,犹厌言兵。", "渐黄昏,清角吹寒。都在空城。", "杜郎俊赏,算而今、重到须惊。" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化
init();
//设置图片自动滚动
new Thread(new Runnable() {
@Override
public void run() {
//如果activity未销毁则一直执行
while (!isStop) {
//先休息5秒钟
SystemClock.sleep(5000);
//以下代码发送到主线程中执行
runOnUiThread(new Runnable() {
@Override
public void run() {
mViewPager.setCurrentItem(mViewPager
.getCurrentItem() + 1);
}
});
}
}
}).start();
}
private void init() {
mViewPager = (ViewPager) this.findViewById(R.id.viewpager);
layoutPGroup = (LinearLayout) this.findViewById(R.id.show_pointer);
imgDes = (TextView) this.findViewById(R.id.image_description);
imageViewlist = new ArrayList<ImageView>();
// 先拿到图片id
int[] ivIDs = new int[] { R.drawable.a, R.drawable.b, R.drawable.c,
R.drawable.d, R.drawable.e };
// 遍历图片id
for (int id : ivIDs) {
// 构造新的图片对象,并根据id给图片设置背景
iv = new ImageView(this);
iv.setBackgroundResource(id);
// 所有的图片存放在imageViewlist中
imageViewlist.add(iv);
// 构造小点
View v = new View(this);
// 设置小点的宽和高
LayoutParams params = new LayoutParams(8, 8);
// 设置小点的左边距
params.leftMargin = 12;
v.setLayoutParams(params);
// 设置小点是否可用,默认都不可用,当不可用时,小点是透明的,否则是白色的
v.setEnabled(false);
// 设置小点的背景,这个背景是使用xml文件画的一个小圆点
v.setBackgroundResource(R.drawable.pointer_selector);
// 把小点添加到它的布局文件中
layoutPGroup.addView(v);
}
// 计算应用打开时显示的第一项 Integer.MAX_VALUE /2 - 3=0
int index = Integer.MAX_VALUE / 2 - 3;
// 给mViewPager设置数据
mViewPager.setAdapter(new MyPagerAdapter());
// 给mViewPager设置页面滑动事件
mViewPager.setOnPageChangeListener(new MyOnPageChangeListener());
// 设置应用打开时显示的第一项,index的值为0
// 使用这种方式得到的0,和直接写0有什么区别呢?
// 直接写0,应用打开后不能直接向右滑动,因为viewpager中存image位置不能为负值,只能先向左滑动
// 这种方式得到的0,可以实现应用一打开,就可以向右滑动
mViewPager.setCurrentItem(index);
}
private class MyOnPageChangeListener implements OnPageChangeListener {
// 开始
@Override
public void onPageScrollStateChanged(int arg0) {
}
// 正在进行时
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
// 结束
@Override
public void onPageSelected(int position) {
// 当页面滑动结束时,先对页面位置取模
position = position % imageViewlist.size();
// 设置textview的文本内容
imgDes.setText(imageDescription[position]);
// 将上一个点的可用性设置为false
layoutPGroup.getChildAt(previousPoint).setEnabled(false);
// 把当前点的可用性设置为true
layoutPGroup.getChildAt(position).setEnabled(true);
// 把当前位置值赋值给previousPoint
previousPoint = position;
}
}
private class MyPagerAdapter extends PagerAdapter {
/**
* 返回图片总数,Integer.MAX_VALUE的值为 2147483647这个数有21亿,也就是说我们的viewpager
* 理论上在每次使用应用的时候可以滑动21亿次,当然,实际上是没人要去这么做的,我们这样做是为了实现实现viewpager循环滑动的效果
* 即当滑动到viewpager的最后一页时,继续滑动就可以回到第一页
*
*/
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
// 当某一页滑出去的时候,将其销毁
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(imageViewlist.get(position
% imageViewlist.size()));
}
// 向容器中添加图片,由于我们要实现循环滑动的效果,所以要对position取模
@Override
public Object instantiateItem(ViewGroup container, int position) {
container
.addView(imageViewlist.get(position % imageViewlist.size()));
return imageViewlist.get(position % imageViewlist.size());
}
}
// 当activity销毁时,让线程停止
@Override
protected void onDestroy() {
isStop = true;
super.onDestroy();
}
}
代码中的注释已经说的很详细了,我就不再赘述了。
未选中的小圆点pointer_disable.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<!-- 设置圆角半径 -->
<corners android:radius="0.5dip" />
<!-- 设置填充的颜色 -->
<solid android:color="#55000000" />
</shape>
选中时的小圆点pointer_focus.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<corners android:radius="0.5dip" />
<solid android:color="#aaFFFFFF" />
</shape>
小圆点的选择器:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 选中时,小点为白色 -->
<item android:state_enabled="true" android:drawable="@drawable/pointer_focus"></item>
<!-- 未选中时,小点为透明色 -->
<item android:state_enabled="false" android:drawable="@drawable/pointer_disable"></item>
</selector>
源码下载:http://xiazai.jb51.net/201606/yuanma/Androidmove(jb51.net).rar
原文链接:http://blog.csdn.net/u012702547/article/details/45845613


猜你喜欢
- 一、C# Thread类的基本用法通过System.Threading.Thread类可以开始新的线程,并在线程堆栈中运行静态或实例方法。可
- 一.概述在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条
- 首先看下我们要分析的代码段如下:输出结果如下:输出结果(a).PNG输出结果(b).PNG输出结果(c).PNG括号里是一个二元式:(单词类
- https://www.jb51.net/article/152879.htm上节,我们明白了proc文件系统的作用,接下来我们在已经写好的
- 1 问题引入1.1 网络架构模型网络架构模型主要有OSI参考模型和TCP/IP五层模型1.1.1 OSI参考模型OSI(Open Syste
- 废话不多说,直接上代码package com.ncu.list;/** * * 顺序结构线性列表 *&nbs
- 1.editplus1.1 官方下载https://www.editplus.com/官方下载最新的64位2 .解压就可以使用2.1 vsc
- 即刻点赞展示点赞的数字增加和减少并不是整个替换,而是差异化替换。再加上动画效果就看的很舒服。自己如何实现这种数字切换呢?下面用一张图来展示我
- 本文实例讲述了Android在JNI中使用ByteBuffer的方法。分享给大家供大家参考。具体如下:一、ByteBuffer 定义在NIO
- 本文实例为大家分享了Unity实现物体左右移动效果的具体代码,供大家参考,具体内容如下效果如下代码:using UnityEngine;us
- 结构:安装NuGet包:using SAP.Middleware.Connector;using System.Data;namespace
- Flutter页面在软键盘弹出的时候,可以设置 Scaffold 的 resizeToAvoidBottomInset 属性来设置
- 其实就只有一条sql语句<select id = "search" resultType = "mate
- 前面我们讲到了Spring在进行事务逻辑织入的时候,无论是事务开始,提交或者回滚,都会触发相应的事务事件。本文首先会使用实例进行讲解Spri
- 一、什么是Spring Cloud?SpringCloud 对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性、可靠、协调的
- 本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL)使用DAL的最大好处是通过直接使用一些类似in
- 本文实例分析了Android编程中activity的完整生命周期。分享给大家供大家参考,具体如下:android中 activity有自己的
- 本文实例讲述了C#交错数组用法。分享给大家供大家参考。具体分析如下:交错数组是数组的数组,交错数组的元素可以是不同的尺寸和大小。交错数组有时
- 以下是代码:package cn.study.concurrency.ch11;/** * 锁分段 * @author xiaof * */
- using System;using System.Collections.Generic;using System.Text;namesp