Android中ViewFlipper的使用及设置动画效果实例详解_Android

本文实例讲述了Android中ViewFlipper的使用及设置动画效果。分享给大家供大家参考,具体如下:

说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果。这里做下ViewFliper实现左右滑动的效果。
会用到以下的技术:

1、ViewFlipper
2、GestureDetector
3、Animation

主要是这三个类在起作用。

ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容器中,让它展示给用户,虽然它每次只展示一个view,我感觉它的用途更好是作为广告展示,比如类似购物网站那样的广告滚动展示。比如可以设置自动播放功能,就可以滚动广告了!

原理:向左向右滑动主要是依赖手势来控制,手势向右滑动就调用 viewFlipper.showNext()方法,同理,向左滑动就会去调用viewFlipper.showPrevious()方法。

效果图如下:

接下来直接上代码:

首先在布局文件中添加ViewFlipper的标签:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="@drawable/pattern1" >
  <Button
    android:id="@+id/treasure_chest_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:background="@drawable/treasure" />
  <ViewFlipper
    android:id="@+id/viewflipper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/treasure_chest_btn" >
  </ViewFlipper>
  <Button
    android:id="@+id/garbage_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/viewflipper"
    android:background="@drawable/garbage" />
</RelativeLayout>

其次是在anim中定义动画:

slide_left_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
  <!--
   画面转换位置移动动画效果
   开始向左动画
   fromXDelta : 动画开始时 X坐标位置
   toXDelta :动画结束时 X坐标位置
   duration :动画持续时间
  -->
  <translate
    android:duration="800"
    android:fromXDelta="100%p"
    android:toXDelta="0" />
</set>

slide_left_out.xml:

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

slide_right_in.xml:

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

slide_right_out.xml:

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

最后是Activity中的实现:

package net.loonggg.demo.slider;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ViewFlipper;
public class MainActivity extends Activity implements OnGestureListener,
    OnTouchListener {
  private GestureDetector detector;
  private ViewFlipper myViewFlipper;
  private int[] imgs = { R.drawable.img0, R.drawable.img1, R.drawable.img2,
      R.drawable.img3, R.drawable.img4, R.drawable.img5 };
  private int displayedChildIndex = 0;
  private Button treasure_btn;
  private Button garbage_btn;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    myViewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
    treasure_btn = (Button) findViewById(R.id.treasure_chest_btn);
    garbage_btn = (Button) findViewById(R.id.garbage_btn);
    myViewFlipper.setOnTouchListener(this);
    myViewFlipper.setLongClickable(true);// 设置长按事件
    // myViewFlipper.setAutoStart(true);// 设置是否自动播放,默认不自动播放
    detector = new GestureDetector(this);
    addFlipperView();
  }
  /**
   * 向FlipperView中动态添加View
   */
  private void addFlipperView() {
    for (int i = 0; i < imgs.length; i++) {
      View view = LayoutInflater.from(this).inflate(
          R.layout.myviewflipper, null);
      TextView title = (TextView) view.findViewById(R.id.view_title);
      title.setText("头像");
      ImageView iv = (ImageView) view.findViewById(R.id.view_image);
      iv.setBackgroundResource(imgs[i]);
      myViewFlipper.addView(view);
    }
  }
  @Override
  public boolean onDown(MotionEvent e) {
    return false;
  }
  @Override
  public void onShowPress(MotionEvent e) {
  }
  @Override
  public boolean onSingleTapUp(MotionEvent e) {
    return false;
  }
  @Override
  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
      float distanceY) {
    return false;
  }
  @Override
  public void onLongPress(MotionEvent e) {
  }
  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
      float velocityY) {
    // 返回当前正在显示的子视图的索引
    displayedChildIndex = myViewFlipper.getDisplayedChild();
    final ImageView iv = (ImageView) myViewFlipper.getChildAt(
        displayedChildIndex).findViewById(R.id.view_image);
    if (e2.getX() - e1.getX() >= 100 && e1.getY() - e2.getY() >= 100) {
      AnimationSet outAnim = (AnimationSet) AnimationUtils.loadAnimation(
          this, R.anim.collect_treasure);
      iv.startAnimation(outAnim);
      outAnim.setAnimationListener(new AnimationListener() {
        public void onAnimationStart(Animation animation) {
        }
        public void onAnimationRepeat(Animation animation) {
        }
        public void onAnimationEnd(Animation animation) {
          showNextView();
          AnimationSet downAnim = (AnimationSet) AnimationUtils
              .loadAnimation(MainActivity.this, R.anim.up_or_down);
          treasure_btn.setAnimation(downAnim);
          iv.clearAnimation();
        }
      });
    } else if (e1.getX() - e2.getX() >= 100 && e2.getY() - e1.getY() >= 100) {
      AnimationSet outAnim = (AnimationSet) AnimationUtils.loadAnimation(
          this, R.anim.throw_garbage);
      iv.startAnimation(outAnim);
      outAnim.setAnimationListener(new AnimationListener() {
        public void onAnimationStart(Animation animation) {
        }
        public void onAnimationRepeat(Animation animation) {
        }
        public void onAnimationEnd(Animation animation) {
          showNextView();
          AnimationSet leftAnim = (AnimationSet) AnimationUtils
              .loadAnimation(MainActivity.this,
                  R.anim.left_or_right);
          garbage_btn.setAnimation(leftAnim);
          iv.clearAnimation();
        }
      });
    } else if (e1.getX() - e2.getX() >= 100) {
      showNextView();
    } else if (e2.getX() - e1.getX() >= 100) {
      showPreviousView();
    }
    return false;
  }
  private void showPreviousView() {
    myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.slide_right_in));
    myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
        R.anim.slide_right_out));
    myViewFlipper.showPrevious();
  }
  private void showNextView() {
    myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.slide_left_in));
    myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
        R.anim.slide_left_out));
    myViewFlipper.showNext();
  }
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    return detector.onTouchEvent(event);
  }
}

希望本文所述对大家Android程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, viewflipper
动画效果
viewflipper 动画、viewflipper切换动画、viewflipper、viewflipper 左右滑动、viewflipper使用,以便于您获取更多的相关知识。

时间: 2024-12-11 19:37:09

Android中ViewFlipper的使用及设置动画效果实例详解_Android的相关文章

Android中ViewFlipper的使用及设置动画效果实例详解

本文实例讲述了Android中ViewFlipper的使用及设置动画效果.分享给大家供大家参考,具体如下: 说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果.这里做下ViewFliper实现左右滑动的效果. 会用到以下的技术: 1.ViewFlipper 2.GestureDetector 3.Animation 主要是这三个类在起作用. ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容

Android中Spinner(下拉框)控件的使用详解_Android

android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧. Spinner位于 android.widget包下,每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样来自适配器.Spinner是View类得一个子类. 1.效果图 2.创建页面文件(main.xml) <Spinner android:id="@+id/spinner1" and

Android自定义进度条的圆角横向进度条实例详解_Android

1.本文将向你介绍自定义进度条的写法,比较简单,但还是有些知识点是需要注意的: invalidate()方法 RectF方法的应用 onMeasure方法的应用 2.原理 画3层圆角矩形,底层为黑色,第二层为灰色,最上一层为进度条颜色,示例图如下: 3.效果图   实现圆角进度条还有很多其他方法,比如在Progress控件里填充圆角图片,通过拉伸图片来达到预想的效果,虽然听起来很简单,但实现起来还是有些麻烦的. 4.解说方法 (1)invalidate()方法 invalidate()是用来刷新

Android开发之Animations动画用法实例详解_Android

本文实例讲述了Android开发之Animations动画用法.分享给大家供大家参考,具体如下: 一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 Java Code代码中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸

Android自定义控件eBook实现翻书效果实例详解_Android

本文实例讲述了Android自定义控件eBook实现翻书效果的方法.分享给大家供大家参考,具体如下: 效果图: Book.java文件: package com.book; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageView; public class Book extend

Android 帧动画的实例详解

Android 帧动画的实例详解 对于 Android 帧动画 大体上可以理解成 一张张图片 按一定顺序切换, 这样当连续几张图是一组动画时,就可以连起来了看成是一个小电影,你懂得 好得,比就装到这里,下面开始进入正题,由于产品需求 需要做一个 声音喇叭动态切换的样式,我特么第一就想到是帧动画切换,然后就百度了一些资料,发现 真的, 现在这个网上太多的资料是 copy粘贴过来的, 一错全错,对于这种情况我只想说,made,一群垃圾, 所以今天我将带你们走进Android 正确帧动画地址. 第一步

Android 逐帧动画创建实例详解

Android 逐帧动画创建实例详解 前言: 我们看早期电影的时候,电影通常是一张一张播放,用我们现在专有名词来说,就是一帧帧来,安卓同样有这样动画效果的编排形式. 那么我们先定义逐帧动画xml文件 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" an

Android中Spinner(下拉框)控件的使用详解

android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧. Spinner位于 android.widget包下,每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样来自适配器.Spinner是View类得一个子类. 1.效果图 2.创建页面文件(main.xml) <Spinner android:id="@+id/spinner1" and

Android自定义进度条的圆角横向进度条实例详解

1.本文将向你介绍自定义进度条的写法,比较简单,但还是有些知识点是需要注意的: invalidate()方法 RectF方法的应用 onMeasure方法的应用 2.原理 画3层圆角矩形,底层为黑色,第二层为灰色,最上一层为进度条颜色,示例图如下: 3.效果图 实现圆角进度条还有很多其他方法,比如在Progress控件里填充圆角图片,通过拉伸图片来达到预想的效果,虽然听起来很简单,但实现起来还是有些麻烦的. 4.解说方法 (1)invalidate()方法 invalidate()是用来刷新Vi