Android入门第31天-Android里的ViewFlipper翻转视图的使用

news2025/8/7 14:46:39

介绍

本篇给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放! 和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候, 用来实现进入应用后的引导页,或者用于图片轮播,本篇我们我们会使用两个例子:一个自动播放首页轮播页一个手动可左右滑动道页的轮播页来说透这个组件的使用。

课程目标

我们可以看到,这是一个化妆品的轮播图。它以每隔2秒的间隔,从右到左自动一个个轮播展现首页的广告图。

项目结构

通过项目结构,我们可以知道我们的轮播页有5页,每一页内含一个图片。

然后我们做了一个平滑过渡的动画:

  • right_in.xml,从右向左,每隔2秒,滑动展示一张;
  • right_out.xml,当图片滑到最后一张,自动切换成第一张再继续从右到左每隔2秒,滑动展示一张

这么一个循环。

前端代码

right_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 
    <translate
        android:duration="2000"
        android:fromXDelta="100%p"
        android:toXDelta="0" />
 
</set>

 right_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
 
    <translate
        android:duration="2000"
        android:fromXDelta="0"
        android:toXDelta="-100%p" />
 
</set>

page_ad_one.xml~page_ad_five.xml

内容都一样,只是内含的图片不一样

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@drawable/ad_pic_1"
        />
</LinearLayout>

 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <ViewFlipper
        android:id="@+id/adFlipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:inAnimation="@anim/right_in"
        android:outAnimation="@anim/right_out"
        android:flipInterval="2000">
 
        <include layout="@layout/page_ad_one" />
        <include layout="@layout/page_ad_two" />
        <include layout="@layout/page_ad_three" />
        <include layout="@layout/page_ad_four" />
        <include layout="@layout/page_ad_five" />
 
    </ViewFlipper>
 
</RelativeLayout>

后端代码

MainActivity.java

package org.mk.android.demoautoflipper;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.widget.ViewFlipper;
 
public class MainActivity extends AppCompatActivity {
 
    private ViewFlipper adFlipper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        adFlipper=(ViewFlipper)findViewById(R.id.adFlipper);
        adFlipper.startFlipping();
    }
}

非常简单。

接着我们来说手动滑动的例子

手动滑动代替了自动轮播,因此我们支持两种手势,往左滑和往右滑。因此我人把从右到左滑设成+向,从左到向设成-向。因此我们为了支持向右、向左的手势还需要设置一组left_in.xml和left_out.xml。

前端代码只增加了left_in.xml和left_out.xml

left_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
 
    <translate
        android:duration="500"
        android:fromXDelta="-100%p"
        android:toXDelta="0" />
 
</set>

left_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 
    <translate
        android:duration="500"
        android:fromXDelta="0"
        android:toXDelta="100%p" />
 
</set>

MainActivity.java

package org.mk.android.demomanualflipper;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.Context;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.ViewFlipper;
 
public class MainActivity extends AppCompatActivity {
 
 
    private Context mContext;
    private ViewFlipper vflp_help;
    private int[] resId = {R.drawable.ad_pic_1, R.drawable.ad_pic_2,
            R.drawable.ad_pic_3, R.drawable.ad_pic_4, R.drawable.ad_pic_5};
 
    private final static int DISTANCE = 200;   //最小距离
    private CustomerizedGestureListener cgListener;
    private GestureDetector gDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        //实例化SimpleOnGestureListener与GestureDetector对象
        cgListener = new CustomerizedGestureListener();
        gDetector = new GestureDetector(this, cgListener);
        vflp_help = (ViewFlipper) findViewById(R.id.adFlipper);
        //动态导入添加子View
        for(int i = 0;i < resId.length;i++){
            vflp_help.addView(getImageView(resId[i]));
        }
    }
    //重写onTouchEvent触发MyGestureListener里的方法
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gDetector.onTouchEvent(event);
    }
    //自定义一个GestureListener,这个是View类下的
    private class CustomerizedGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float v, float v1) {
            if(e1.getX() - e2.getX() > DISTANCE){
                vflp_help.setInAnimation(mContext,R.anim.right_in);
                vflp_help.setOutAnimation(mContext, R.anim.right_out);
                vflp_help.showNext();
            }else if(e2.getX() - e1.getX() > DISTANCE){
                vflp_help.setInAnimation(mContext,R.anim.left_in);
                vflp_help.setOutAnimation(mContext, R.anim.left_out);
                vflp_help.showPrevious();
            }
            return true;
        }
    }
 
    private ImageView getImageView(int resId){
        ImageView img = new ImageView(this);
        img.setBackgroundResource(resId);
        return img;
    }
}

代码导读:

  • 首先,在这个例子里我们使用了代码来添加一个个ViewFlipper;
  • 其次我们定义了一个GestureDetector.SimpleOnGestureListener来支持向左滑屏或者向右滑屏。在这个事件里我们通过e1与e2的距离(DISTANCE)可判断出正负,然后以此来控制向左到头来换第一张,向右到头了换最后一张的效果;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vivado在Linux下的安装与运行

一. Vivado安装步骤 下载解压安装包后&#xff0c;并进入安装包路径运行终端 cd Downloads/Xilinx_Vivado_SDK_2017.4运行 sudo apt install libncurses5 安装ncurses库 sudo apt install libncurses5 运行 sudo chmod x setup 添加可执行权限 sudo chmod x setup运行 sudo .…

PHP反序列化漏洞解析

序列化 所谓序列化就是将原数据对象转换为具有一定格式的数据 举一个最简单的例子&#xff0c;在C中&#xff0c;若要开发一个数据库&#xff0c;那么一定涉及到数据的存储&#xff0c;要将内存中的数据持久化的保存在磁盘中&#xff0c;这就要对数据的存储格式进行优化&…

[附源码]java毕业设计企业信息网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

网关及其分类

1. 介绍 大家都知道&#xff0c;从一个房间走到另一个房间&#xff0c;必然要经过一扇门。同样&#xff0c;从一个网络向另一个网络发送信息&#xff0c;也必须经过一道“关口”&#xff0c;这道关口就是网关。顾名思义&#xff0c;网关(Gateway)就是一个网络连接到另一个网络的…

深度探究多线程的效率以及多线程的使用建议

随着时代发展&#xff0c;电脑的核心数慢慢增多&#xff0c;在开发程序的过程中&#xff0c;是否选择使用多线程这是个比较大的问题&#xff0c;下面我通过一个程序去深入理解多线程对程序速度的影响到底有多大 计算亿级别个数的累加和&#xff1a; 单线程模型运行程序&#…

SNMP(二)

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放。 目录 一.SNMP是什么 二.SolarWinds 网管软件使用 步骤1 步骤2 步骤3 步骤4 三.SNMP命令…

使用go pprof进行golang程序内存分析

引言 日常项目&#xff0c;有时会出现oom的情况&#xff0c;这时候我们光依靠code review进行问题定位是很困难的。这里我们需要一个排查工具&#xff0c;来定位是哪里的代码导致内存溢出的&#xff0c;这个工具就是pprof前提 如果是非http(s)服务类的&#xff0c;需要在代码…

基于PHP+MySQL的宠物领养救助社交网站

当前很多的宠物被抛弃和虐杀,它们没有选择权,我们强制性的把狗带进人类的生活中,然后又无情的抛弃,让它们无家可归,变成流浪狗,它们做错了什么&#xff1f;流浪动物被主人遗弃之后居无定所,时刻面对着严寒、酷暑、生病、死亡,饥饿、等一系列威胁它们生命的存在为了能够让这些。…

BlenderGIS插件 城市建筑3D模型自动生成 教程

目录 一、下载Blender和BlenderGIS 二、解决 No imaging library...报错 三、生成城市3D模型 四、导出模型 本文所需文件可在如下链接下载&#xff0c;或者直接按照博文下载步骤下载 https://download.csdn.net/download/ChaoChao66666/87071901?spm1001.2014.3001.550…

Node的Web编程

一、node的事件处理 1、node采用的事件驱动模式来进行事件处理的&#xff1a;只有当事件被触发时才执行相关程序 2、node是单线程运行的&#xff1a;采用事件轮询方式&#xff0c;不断的查询事件队列中的消息&#xff0c;然后根据消息执行对应的回调函数 3、node事件机制中的…

ASEMI代理艾赛斯DSP25-12A,整流二极管DSP25-12A

编辑-Z 艾赛斯整流二极管DSP25-12A参数&#xff1a; 型号&#xff1a;DSP25-12A 最大重复反向阻断电压&#xff08;VRRM&#xff09;&#xff1a;1200V 反向电流、漏极电流&#xff08;IR&#xff09;&#xff1a;40uA 正向电压降&#xff08;VF&#xff09;&#xff1a;1…

this用法总结

文章目录1.常规下this的指向1.1 全局环境中的this1.2 上下文对象调用中的this1.3 this指向绑定事件的元素1.4 箭头函数的this指向2. 改变this指向2.1 call - Function.prototype.call( )2.1.1 call的第一个参数2.1.2 call接受多个参数2.1.3 调用对象的原生方法2.2 apply - Func…

LFMCW雷达测速基础- 多普勒频移和2DFFT

LFMCW雷达测速基础1 基本测速原理——多普勒频移1.0 写在前面1.1 多普勒效应1.2 多普勒频移疑问2 LFMCW雷达测速原理2.1 Doppler Shift 到底是调频还是调相2.2 为什么是二维FFT1 基本测速原理——多普勒频移 1.0 写在前面 振动/波在空间中传播有三个关键变量&#xff0c;分别…

iNFTnews|Web3正在重新定义粉丝的意义

数字身份正在发展&#xff0c;粉丝圈本身也在发展。Web3技术使粉丝们能够以一种更加人际化的方式与同好、媒体、内容创作者甚至他们崇拜的名人进行互动&#xff0c;粉丝和创作者都可以获得更人性化的体验。另外&#xff0c;一些激励措施还有望从根本上改变我们对名人概念本身的…

Java#14(StringJoiner)

目录 一.StringJoiner的构造方法和成员方法 StringJoiner是jdk8才出现的 作用:可以高效和方便的拼接字符串 1.StringJoiner的构造方法 2.StringJoiner的成员方法 一.StringJoiner的构造方法和成员方法 StringJoiner是jdk8才出现的 作用:可以高效和方便的拼接字符串 1.Stri…

一篇文章入门单链表+刷题实践【java实现+详细注释】

文章目录节点定义链表类获取链表长度清空链表添加节点到链表尾部根据id来删除节点根据id来查询节点修改相同id的节点信息打印链表逆序打印反转链表测试代码打印信息习题反转链表删除链表的节点删除链表的倒数第k个节点节点定义 关于节点里面所存储的信息&#xff0c;需要什么就…

洛谷 P1064 - 金明的预算方案(分组背包)

题目描述 金明今天很开心&#xff0c;家里购置的新房就要领钥匙了&#xff0c;新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是&#xff0c;妈妈昨天对他说&#xff1a;“你的房间需要购买哪些物品&#xff0c;怎么布置&#xff0c;你说了算&#xff0c;只要不超过 n…

HTML学生个人网站作业设计:(宠物官网8页)——bootstarp响应式含有轮播图,响应式页面

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#…

H7-TOOL发布V2.19,脱机烧录新增中微半导体、广芯微电子、中移芯昇以及极海和灵动新系列,增加PWM发生器等功能(2022-11-17)

H7-TOOL详细介绍&#xff1a;H7-TOOL开发工具&#xff0c;1拖4/16脱机烧录&#xff0c;高速DAPLINK&#xff0c;RTOS Trace&#xff0c;CAN/串口助手, 示波器, RTT等&#xff0c;支持WiFi&#xff0c;以太网&#xff0c;高速USB和手持 - H7-TOOL开发工具 - 硬汉嵌入式论坛 - Po…

JavaScript对象与内置对象

JavaScript对象与内置对象 文章目录JavaScript对象与内置对象1.JavaScript的基本对象1.1 创建对象1.2 对象的调用1.3 构造函数和对象1.4 变量对象属性2.JavaScript的内置对象2.1 内置对象概念3.JavaScript的Math对象3.1 Math对象概念3.2 Math绝对值和三个取整方法3.3 随机数方法…