Android实现图片轮播效果
作者:徐刘根 发布时间:2022-01-24 02:33:13
标签:Android,轮播
本文实例讲述了Android实现图片轮播效果代码,分享给大家供大家参考。具体如下:
运行效果截图如下:
具体代码如下:
首先看下一下布局文件:
<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=".MainActivity" >
<!-- 广告条的使用 -->
<com.xuliugen.viewpager.MyViewPagerTransformerAnim
android:id="@+id/viewpager"
android:layout_width="match_parent"
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" >
<TextView
android:id="@+id/image_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@android:color/white"
android:textSize="16sp" />
<LinearLayout
android:id="@+id/point_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="5dp"
android:orientation="horizontal" >
</LinearLayout>
</LinearLayout>
</RelativeLayout>
效果很简单,从布局文件中我们看到使用了一个自定义的ViewPager动画,代码如下:
package com.xuliugen.viewpager;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import com.nineoldandroids.view.ViewHelper;
/*
* 自定义viewpager实现动画切换效果:
*
* 1、需要拿到当前切换的两个view
*
* 2、一个动画的梯度值
*/
public class MyViewPagerTransformerAnim extends ViewPager {
private View mLeft;
private View mRight;
private float mTrans;
private float mScale;
private static final float MIN_SCALE = 0.6f;
private Map<Integer, View> mChildren = new HashMap<Integer, View>();
/*
* 要有两个构造方法
*/
public MyViewPagerTransformerAnim(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyViewPagerTransformerAnim(Context context) {
super(context);
}
/*
* 设置put的方法
*/
public void setViewForPosition(View view, int position) {
mChildren.put(position, view);
}
/*
* remove的方法
*/
public void removeViewFromPosition(Integer position) {
mChildren.remove(position);
}
/**
* 重写的方法
*/
@Override
protected void onPageScrolled(int position, float offset, int offsetPixels) {
// Log.e("TAG", "position =" + position + ",offset = " + offset);
mLeft = mChildren.get(position);
mRight = mChildren.get(position + 1);
animStack(mLeft, mRight, offset, offsetPixels);// 创建动画效果
super.onPageScrolled(position, offset, offsetPixels);
}
private void animStack(View left, View right, float offset, int offsetPixels) {
if (right != null) {
// 从0-1页,offset:0`1
mScale = (1 - MIN_SCALE) * offset + MIN_SCALE;
mTrans = -getWidth() - getPageMargin() + offsetPixels;
ViewHelper.setScaleX(right, mScale);
ViewHelper.setScaleY(right, mScale);
ViewHelper.setTranslationX(right, mTrans);
}
if (left != null) {
left.bringToFront();
}
}
}
MainActivity.java
package com.xuliugen.viewpager;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
private ViewPager viewPager;
private LinearLayout pointGroup;
private TextView iamgeDesc;
// 图片资源ID
private final int[] imageIds = { R.drawable.a, R.drawable.b, R.drawable.c,
R.drawable.d, R.drawable.e };
// 图片标题集合
private final String[] imageDescriptions = { "巩俐不低俗,我就不能低俗",
"扑树又回来啦!再唱经典老歌引万人大合唱", "揭秘北京电影如何升级", "乐视网TV版大派送", "热血 * 丝的反杀" };
private ArrayList<ImageView> imageList;
/**
* 上一个页面的位置
*/
protected int lastPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewpager);
pointGroup = (LinearLayout) findViewById(R.id.point_group);
iamgeDesc = (TextView) findViewById(R.id.image_desc);
iamgeDesc.setText(imageDescriptions[0]);
imageList = new ArrayList<ImageView>();
for (int i = 0; i < imageIds.length; i++) {
// 初始化图片资源
ImageView image = new ImageView(this);
image.setBackgroundResource(imageIds[i]);
imageList.add(image);
// 添加指示点
ImageView point = new ImageView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.rightMargin = 20;
point.setLayoutParams(params);
point.setBackgroundResource(R.drawable.point_bg);
if (i == 0) {
point.setEnabled(true);
} else {
point.setEnabled(false);
}
pointGroup.addView(point);
}
viewPager.setAdapter(new MyPagerAdapter());
// viewPager.setCurrentItem(Integer.MAX_VALUE/2 -
// (Integer.MAX_VALUE/2%imageList.size())) ;
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
/**
* 页面切换后调用
* position 新的页面位置
*/
public void onPageSelected(int position) {
position = position % imageList.size();
// 设置文字描述内容
iamgeDesc.setText(imageDescriptions[position]);
// 改变指示点的状态
// 把当前点enbale 为true
pointGroup.getChildAt(position).setEnabled(true);
// 把上一个点设为false
pointGroup.getChildAt(lastPosition).setEnabled(false);
lastPosition = position;
}
@Override
/**
* 页面正在滑动的时候,回调
*/
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
/**
* 当页面状态发生变化的时候,回调
*/
public void onPageScrollStateChanged(int state) {
}
});
/*
* 自动循环: 1、定时器:Timer 2、开子线程 while true 循环 3、ColckManager 4、 用handler
* 发送延时信息,实现循环
*/
isRunning = true;
// 设置图片的自动滑动
handler.sendEmptyMessageDelayed(0, 3000);
}
/**
* 判断是否自动滚动
*/
private boolean isRunning = false;
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 让viewPager 滑动到下一页
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
if (isRunning) {
handler.sendEmptyMessageDelayed(0, 3000);
}
};
};
protected void onDestroy() {
isRunning = false;
};
private class MyPagerAdapter extends PagerAdapter {
@Override
/**
* 获得页面的总数
*/
public int getCount() {
return Integer.MAX_VALUE; // 使得图片可以循环
}
@Override
/**
* 获得相应位置上的view
* container view的容器,其实就是viewpager自身
* position 相应的位置
*/
public Object instantiateItem(ViewGroup container, int position) {
// System.out.println("instantiateItem ::" + position);
// 给 container 添加一个view
container.addView(imageList.get(position % imageList.size()));
// 返回一个和该view相对的object
return imageList.get(position % imageList.size());
}
@Override
/**
* 判断 view和object的对应关系
*/
public boolean isViewFromObject(View view, Object object) {
if (view == object) {
return true;
} else {
return false;
}
}
@Override
/**
* 销毁对应位置上的object
*/
public void destroyItem(ViewGroup container, int position, Object object) {
// System.out.println("destroyItem ::" + position);
container.removeView((View) object);
object = null;
}
}
}
另外我们看效果图可以看出,效果图下边的几个原点是变化的,所以我们需要一个selector,如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/point_nomal" android:state_enabled="false"/>
<item android:drawable="@drawable/point_focured" android:state_enabled="true"/>
</selector>
希望本文所述对大家学习Android软件编程有所帮助。
0
投稿
猜你喜欢
- 本文实例总结了C#配置文件Section节点处理方法。分享给大家供大家参考。具体如下:很多时候在项目开发中,我们都需要用配置文件来存储一些关
- 例子一,获取三小时前的记录public static DataTable Query(){const string sSql = "
- JPA @Basic单表查询实现大字段懒加载近期看了JPA@Basic注解的使用,看到该注解可以设置字段的懒加载。1.以前碰到的懒加载:我们
- Java 方法执行时的动态分派和静态分派是 Java 实现多态的本质背景Java 的动态分派和静态分派也是 Java 方法的执行原理。 Ja
- java.math.BigDecimal及加减乘除计算BigDecimal简介BigDecimal用来对需要更大或更小的数进行任意精度的运算
- 本文实例为大家分享了java实现猜拳游戏的具体代码,供大家参考,具体内容如下package com.farsight.session7;im
- 一、简介1.什么是GUID?全局唯一标识符(GUID,Globally Unique Identifier),GUID也称作 UUID(Un
- 简单说明一下:线程池可以看做容纳线程的容器;一个应用程序最多只能有一个线程池;ThreadPool静态类通过QueueUserWorkIte
- kaptcha是一个开源的验证码实现库1.添加依赖<dependency> <groupId>com.g
- 刚开始做开发学习的小伙伴可能在有一个知识上面有错误的认知,我们天天写程序是在Idea下写的,运行也是在Idea下运行的。但是实际开发完成后,
- 自定义一个漂亮实用的锁屏app,如果能赢得用户的认可,替换系统自带的锁屏,绝对是一个不小的日活入口。这段时间正好总结一下最近调研的Andro
- 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是
- 1.介绍说明: 其实@Valid 与 @Validated都是做数据校验的,只不过注解位置与用法有点不同。不同点:(1)@Valid是使用H
- JPA主键@Id,@IdClass,@Embeddable,@EmbeddedId1、自动主键默认情况下,主键是一个连续的64位数字(lon
- 依赖配置结合前面的内容,这里我们要嵌入数据库的操作,这里以操作MySQL为例整合Mybatis,首先需要在原来的基础上添加以下依赖<!
- Java的动态绑定所谓的动态绑定就是指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。java继承
- 想做一个APP,设计中有侧边栏这个功能,所以现在开始学习下侧边栏的实现。在官方的UI空间中已经给出了DrawerLayout这个侧滑的菜单空
- 一、Widget设计步骤需要修改三个XML,一个class:1.第一个xml是布局XML文件(如:main.xml),是这个widget的。
- 目前在公司做一个小东西,里面用到了 FFmpeg 简单处理音视频,感觉功能特别强大,在做之前我写了一个小例子,现在记录一下分享给大家,希望大
- 0.背景简介微软在 .NET 框架中提供了多种实用的线程同步手段,其中包括 monitor 类及 reader-writer锁。