使用ViewFlipper实现广告图片的自动轮播的效果
轮播资源图片的实现
package com.loaderman.viewflipperdemo; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import android.widget.ViewFlipper; public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
private ViewFlipper mFlipper;
private GestureDetector mDetector; //手势检测 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFlipper = (ViewFlipper) findViewById(R.id.flipper);
mFlipper.setOnTouchListener(this);
mDetector = new GestureDetector(new simpleGestureListener());
mFlipper.startFlipping();//开始切换,注意,如果设置了时间间隔,想让它自动切换,一定要记得加它
} @Override
public boolean onTouch(View v, MotionEvent event) {
return mDetector.onTouchEvent(event);
} private class simpleGestureListener extends GestureDetector.SimpleOnGestureListener {
final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200; //不加上onDown函数的话,onFling就不会响应
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "ondown", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// Fling left
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE
&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
mFlipper.showNext();
Toast.makeText(MainActivity.this, "Fling Left", Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE
&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling right
mFlipper.showPrevious();
Toast.makeText(MainActivity.this, "Fling Right", Toast.LENGTH_SHORT).show();
}
return true;
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.loaderman.viewflipperdemo.MainActivity"> <ViewFlipper
android:id="@+id/flipper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="10dp"
android:flipInterval="3000" >
<ImageView
android:layout_width="fill_parent"
android:layout_height="300dip"
android:scaleType="fitXY"
android:src="@drawable/a"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="300dip"
android:scaleType="fitXY"
android:src="@drawable/b"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="300dip"
android:scaleType="fitXY"
android:src="@drawable/c"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="300dip"
android:scaleType="fitXY"
android:src="@drawable/d"/>
</ViewFlipper>
</RelativeLayout>
效果:
动态加载广告图片的轮播实现
package com.loaderman.viewflipperdemo; import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.ViewFlipper; public class MainActivity extends AppCompatActivity {
private ViewFlipper flipper;
private GestureDetector detector; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
} private void init() {
flipper = (ViewFlipper) findViewById(R.id.vf);
flipper.addView(getImageView(R.drawable.a));//在一个根视图中动态添加子视图,可以根据new对象来进行子视图的增加和删减
flipper.addView(getImageView(R.drawable.b));
flipper.addView(getImageView(R.drawable.c));
flipper.addView(getImageView(R.drawable.d));
flipper.addView(getImageView(R.drawable.e));
flipper.setInAnimation(inFromRightAnimation());//设置View进入屏幕时候使用的动画
flipper.setOutAnimation(outToLeftAnimation()); //设置View退出屏幕时候使用的动画
flipper.setFlipInterval(2000);//设置自动切换的间隔时间
flipper.startFlipping();//开启切换效果
flipper.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return MainActivity.this.detector.onTouchEvent(event);//当有触屏事件作用于ViewFlipper时,把这个触屏事件返回给 GestureDetector手势识别器处理
//如果想要把整个屏幕上的触屏事件都返回给 GestureDetector手势识别器处理,
//而不单单是在ViewFlipper上发生触屏事件时就给 GestureDetector处理,
//那么我们就不必为flipper单独设置onTouchListener()触摸监听器了,就只需要重写Activity中的onTouchEvent()方法,
//在该方法中讲整个屏幕的触摸事件返回给手势识别器处理就行
}
}); detector = new GestureDetector(this, new GestureDetector.OnGestureListener() {//创建手势识别器并监听手势事件 @Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
} @Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
} @Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
/*
* 用户按下触摸屏、快速移动后松开即触发这个事件
* e1:第1个ACTION_DOWN MotionEvent
* e2:最后一个ACTION_MOVE MotionEvent
* velocityX:X轴上的移动速度,像素/秒
* velocityY:Y轴上的移动速度,像素/秒
* 触发条件 :
* X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {//滑动事件回调函数 final float FLING_MIN_DISTANCE = 100;//最小滑动像素
final float FLING_MIN_VELOCITY = 150;//最小滑动速度
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE &&
Math.abs(velocityX) > FLING_MIN_VELOCITY) {//X轴上的移动速度去绝对值进行比较
//判断x轴坐标如果第一次按下时的坐标减去第二次离开屏幕时的坐标大于我们设置的位移,因为一个控件的原点是在左上角,就说明此时是向左滑动的
//设置View进入屏幕时候使用的动画
flipper.setInAnimation(inFromRightAnimation());
//设置View退出屏幕时候使用的动画
flipper.setOutAnimation(outToLeftAnimation());
flipper.showNext();//显示下一个视图 } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE &&
Math.abs(velocityX) > FLING_MIN_VELOCITY) {
//判断x轴坐标如果第二次离开屏幕时的坐标减去第一次按下时的坐标大于我们设置的位移,因为一个控件的原点是在左上角,就说明此时是向右滑动的
flipper.setInAnimation(inFromLeftAnimation());
flipper.setOutAnimation(outToRightAnimation());
flipper.showPrevious();//显示上一个视图
}
return true;
} @Override
public boolean onDown(MotionEvent e) {//手指按下屏幕时触发
flipper.stopFlipping();//当触摸到ViewFlipper时,就让它停止自动滑动,如果要触摸到整个屏幕的任意一处就让它停止滑动,就按上面那个方法,不用设置ViewFlipper的触摸事件监听了
new Handler().postDelayed(new Runnable() {//在当前线程(也即主线程中)开启一个消息处理器,并在3秒后发送flipper.startFlipping();这个消息给主线程,再让它自动滑动,从而来更新UI
@Override
public void run() {
flipper.startFlipping();//3秒后执行,让它又开始滑动
}
}, 3000);
return true;
}
});
} //创建一个ImageView对象
private ImageView getImageView(int id) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(id);
return imageView;
} /**
* 定义从右侧进入的动画效果
* @return
*/
protected Animation inFromRightAnimation() {
Animation inFromRight = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, +1.0f,
Animation.RELATIVE_TO_PARENT, 0.0f,
Animation.RELATIVE_TO_PARENT, 0.0f,
Animation.RELATIVE_TO_PARENT, 0.0f);
inFromRight.setDuration(200);
inFromRight.setInterpolator(new AccelerateInterpolator());
return inFromRight;
} /**
* 定义从左侧退出的动画效果
* @return
*/
protected Animation outToLeftAnimation() {
Animation outtoLeft = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, 0.0f,
Animation.RELATIVE_TO_PARENT, -1.0f,
Animation.RELATIVE_TO_PARENT, 0.0f,
Animation.RELATIVE_TO_PARENT, 0.0f);
outtoLeft.setDuration(200);
outtoLeft.setInterpolator(new AccelerateInterpolator());
return outtoLeft;
} /**
* 定义从左侧进入的动画效果
* @return
*/
protected Animation inFromLeftAnimation() {
Animation inFromLeft = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, -1.0f,
Animation.RELATIVE_TO_PARENT, 0.0f,
Animation.RELATIVE_TO_PARENT, 0.0f,
Animation.RELATIVE_TO_PARENT, 0.0f);
inFromLeft.setDuration(200);
inFromLeft.setInterpolator(new AccelerateInterpolator());
return inFromLeft;
} /**
* 定义从右侧退出时的动画效果
* @return
*/
protected Animation outToRightAnimation() {
Animation outtoRight = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, 0.0f,
Animation.RELATIVE_TO_PARENT, +1.0f,
Animation.RELATIVE_TO_PARENT, 0.0f,
Animation.RELATIVE_TO_PARENT, 0.0f);
outtoRight.setDuration(200);
outtoRight.setInterpolator(new AccelerateInterpolator());
return outtoRight;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.loaderman.viewflipperdemo.MainActivity"> <ViewFlipper
android:id="@+id/vf"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoStart="true"
android:flipInterval="3000"
android:inAnimation="@anim/anim_marque_in"
android:outAnimation="@anim/anim_marque_out"
/>
</RelativeLayout>
效果:
本文学习来源:http://blog.csdn.net/u013378580/article/details/52038255
使用ViewFlipper实现广告图片的自动轮播的效果的更多相关文章
- jQuery实际案例①——淘宝精品广告(鼠标触碰切换图片、自动轮播图片)
遇到的问题:自动轮播的实现,实质与轮播图一样儿一样儿的,不要被不同的外表所欺骗,具体的js代码如下:
- JQuery实现页面企业广告图片切换和新闻列表滚动效果
最近用到一个页面上图片左右切换和新闻列表滚动呈现的效果,整理如下: 前段代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...
- Jquery+css实现图片无缝滚动轮播
Today,在XX学院的教学视频中,偶尔看到了Jquery+css实现图片无缝滚动轮播视频教程,虽然以前已写过类似的,但是我感觉他学的比较精简.为了方便以后做项目时直接拷贝,特地写出来,顺便和大家分享 ...
- JS实现自动轮播图效果(js案例)
现在很多网站都有轮播图,这篇文章主要为大家详细介绍了js实现轮播图的完整代码及原理,需要的小伙伴可以参考一下. 1.轮播图主要功能: 1. 图片自动轮播(主图切换同时下面导航图片也会跟着变化) 2. ...
- 使用ViewPager实现广告自动轮播的效果
package com.loaderman.viewpgerlunbodemo; import android.os.Bundle; import android.os.Handler; import ...
- 仿网易新闻 ViewPager 实现图片自动轮播
新闻 App 首页最上方一般会循环播放热点图片,如下图所示. 本文主要介绍了利用 ViewPager 实现轮播图片,图片下方加上小圆点指示器标记当前位置,并利用 Timer+Handler 实现了自动 ...
- ios - 图片自动轮播定时器(NSTimer)以及消息循环模式简介
本文只是演示如何设置图片轮播的定时器. 创建全局变量NSTimer 程序启动后就开始轮播图片,所以在- (void)viewDidLoad中就启动定时器. 将定时器放入消息循环池中.- (void)v ...
- ViewPager自动轮播
Android使用ViewPager实现左右循环滑动及轮播效果 ViewPager是一个常用的android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候 ...
- iOS开发——高级篇——图片轮播及其无限循环效果
平时APP中的广告位.或者滚动的新闻图片等用到的就是图片轮播这种效果,实现方式主要有两种,一种是ScrollView+ImageView,另一种则是通过CollectionView,今天总结的是Scr ...
随机推荐
- contextlib:上下文管理器工具
介绍 contextlib模块包含的工具可以用于处理上下文管理器和with语句 上下文管理器API ''' 上下文管理器(context manager)负责管理一个代码块中的资源,会在进入代码块时创 ...
- urllib.parse:很底层,但是是一个处理url路径的好模块
介绍 urllib.parse是为urllib包下面的一个模块,urllib的其它模块完全可以使用requests替代.但是urlli.parse我们是有必要了解的,因为该模块下面有很多操作url路径 ...
- 【转】(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...
- Linq表达树(固定参数)
这篇博客只能用来批判因为我刚刚学习linq对它了解只有简单的linq to sql 的语句所以来写这个博客只能说是班门弄斧了,看的下去的话就坚持看吧. 在网上看了别人的文章目前水平有限借鉴别人的思想吧 ...
- Psychos in a Line CodeForces - 319B (单调栈的应用)
Psychos in a Line CodeForces - 319B There are n psychos standing in a line. Each psycho is assigned ...
- 安装及创建python虚拟环境
有点气,是真的有点气,以为安装错误了,没想到是命令问题 参考链接: https://cloud.tencent.com/developer/article/1176291 https://www.cn ...
- 函数参数-undefined-默认值-可选参数
1.函数参数为undefined时,触发参数默认值 2.实参数量 < 形参数量,多余的形参值为 underfined 3.设置可选参数 1)JS中: 检测 undefined :function ...
- php类知识点滴---魔术方法,系统在特定时机触发的方法
__get()获取私有或受保护属性时调用的方法 <?php class coach { private $chairfit = "徐晓冬"; public function ...
- Java-WebServiceUtil工具类
/** * Program : WebServiceUtil.java * Author : leigq * Create : 2010-11-12 上午09:02:05 * * Copyright ...
- Java之ExceptionHelper工具类
import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.e ...