Android滑动动画,可以用ViewPager或者ViewFlipper实现。

ViewPager自带触摸滑动功能,结合Fragment使用很好,来自补充组件android-support-v4.jar;

ViewFlipper要借助GestureDetector来实现手势滑动,是系统自带组件。

下面是用ViewFlipper实现的图片滑动动画,没有手势滑动功能,activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/splash"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/centerPoint"
        android:text="center"
        android:gravity="center"
        android:layout_centerInParent="true"/>

    <ImageView
        android:layout_width="138dp"
        android:layout_height="39dp"
        android:src="@drawable/loading"
        android:id="@+id/loading"
        android:layout_above="@+id/centerPoint"
        android:layout_alignLeft="@id/centerPoint"
        android:layout_marginBottom="90dp"/>

    <ImageView
        android:layout_width="142dp"
        android:layout_height="113dp"
        android:id="@+id/pet"
        android:layout_toLeftOf="@id/loading"
        android:layout_alignTop="@id/loading"
        android:layout_marginTop="-35dp"
        android:layout_marginRight="-6dp"
        android:src="@drawable/pet"/>

    <ImageView
        android:layout_width="18dp"
        android:layout_height="20dp"
        android:id="@+id/zz"
        android:background="@drawable/zz"
        android:layout_alignRight="@id/pet"
        android:layout_alignTop="@id/pet"
        android:layout_marginRight="30dp"
        android:layout_marginTop="5dp"/>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bg"
        android:background="@drawable/bg"
        android:layout_alignTop="@id/loading"
        android:layout_marginTop="50dp"/>

    <ViewFlipper
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/flipper"
        android:layout_alignTop="@id/loading"
        android:layout_marginTop="56dp"/>

</RelativeLayout>

在创建滑动动画前,还需要播放一小段mp4视频作为Logo,这里使用android的VideoView完成。

除了layout中的activity_main.xml资源文件,我们把logo.mp4文件和一些用于滑动动画的图片放入drawable目录下。

package com.example.mytest;

import java.util.Random;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.VideoView;
import android.widget.ViewFlipper;

public class MainActivity extends Activity implements OnCompletionListener, OnPreparedListener {

    private static MainActivity m_Activity;
    private VideoView m_videoView;
    private RelativeLayout m_rootLayout;
    private boolean m_logoFinished;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        m_Activity = this;
        m_Activity.runOnUiThread(new VideoSplashTask());

        LayoutInflater inflater = LayoutInflater.from(m_Activity);
        m_rootLayout = (RelativeLayout)inflater.inflate(R.layout.activity_main, null);
        PrepareForStartLogo();
    }

    private class VideoSplashTask implements Runnable {

        @Override
        public void run() {
            m_videoView = new VideoView((Context)m_Activity);
            m_videoView.setOnCompletionListener(MainActivity.m_Activity);
            m_videoView.setOnPreparedListener(MainActivity.m_Activity);

            Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.drawable.logo);
            m_videoView.setVideoURI(uri);
            LinearLayout ll = new LinearLayout(MainActivity.m_Activity);
            ll.setGravity(Gravity.CENTER);
            ll.setOrientation(LinearLayout.VERTICAL);
            ll.setBackgroundColor(Color.WHITE);
            ll.addView(m_videoView);
            m_Activity.addContentView(ll, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

            m_videoView.setZOrderOnTop(true);
            m_videoView.requestFocus();
            m_videoView.start();
        }
    }

    @Override
    public void onCompletion(MediaPlayer arg0) {
        ViewParent layout = m_videoView.getParent();
        ((ViewGroup)layout.getParent()).removeView((View)layout);
        m_videoView = null;
        m_Activity.runOnUiThread(m_UiThreadStartLogo);

        // destroy splash screen by view
        m_rootLayout.postDelayed(m_UiThreadStopLogo, 3000);
    }

    @Override
    public void onPrepared(MediaPlayer player) {
        int width = player.getVideoWidth();
        int height = player.getVideoHeight();
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int screenWidth = dm.widthPixels;;
        int screenHeight = dm.heightPixels;

        // fill screen with the video
        float scale = Math.max((float)screenWidth / width, (float)screenHeight / height);
        LayoutParams lp = m_videoView.getLayoutParams();
        lp.width = (int)Math.ceil(scale * width);
        lp.height = (int)Math.ceil(scale * height);
        m_videoView.setLayoutParams(lp);

        m_videoView.start();
    }

    private void PrepareForStartLogo()
    {
        ViewFlipper mFlipper = (ViewFlipper)m_rootLayout.findViewById(R.id.flipper);
        int[] imgResId = new int[] {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e };
        for (int i = 0; i < imgResId.length; i++){
            ImageView imageView = new ImageView(m_Activity);
            imageView.setImageResource(imgResId[i]);
            mFlipper.addView(imageView);
        }
        mFlipper.setDisplayedChild(new Random().nextInt(imgResId.length));

        // viewFlipper animation
        AnimationSet mFlipper_animSet_in = new AnimationSet(true);
        TranslateAnimation mFlipper_animIn_t = new TranslateAnimation(
                TranslateAnimation.RELATIVE_TO_SELF, 1f,
                TranslateAnimation.RELATIVE_TO_SELF, 0f,
                TranslateAnimation.RELATIVE_TO_SELF, 0f,
                TranslateAnimation.RELATIVE_TO_SELF, 0f);
        mFlipper_animIn_t.setDuration(300);
        mFlipper_animSet_in.addAnimation(mFlipper_animIn_t);

        AnimationSet mFlipper_animSet_out = new AnimationSet(true);
        TranslateAnimation mFlipper_animOut_t = new TranslateAnimation(
                TranslateAnimation.RELATIVE_TO_SELF, 0f,
                TranslateAnimation.RELATIVE_TO_SELF, -1f,
                TranslateAnimation.RELATIVE_TO_SELF, 0f,
                TranslateAnimation.RELATIVE_TO_SELF, 0f);
        mFlipper_animOut_t.setDuration(300);
        mFlipper_animSet_out.addAnimation(mFlipper_animOut_t);

        mFlipper.setInAnimation(mFlipper_animSet_in);
        mFlipper.setOutAnimation(mFlipper_animSet_out);
        mFlipper.setFlipInterval(4000);
        mFlipper.startFlipping();

        // image zz animation
        final int animDuration = 1600;

        TranslateAnimation mZZ_anim_translate = new TranslateAnimation(
                TranslateAnimation.RELATIVE_TO_SELF, 0f,
                TranslateAnimation.RELATIVE_TO_SELF, 1.8f,
                TranslateAnimation.RELATIVE_TO_SELF, 0f,
                TranslateAnimation.RELATIVE_TO_SELF, -1f);
        mZZ_anim_translate.setDuration(animDuration);
        mZZ_anim_translate.setInterpolator(new DecelerateInterpolator());
        mZZ_anim_translate.setRepeatMode(Animation.RESTART);
        mZZ_anim_translate.setRepeatCount(Integer.MAX_VALUE);

        ScaleAnimation mZZ_anim_scale = new ScaleAnimation(1, 2, 1, 2,
                Animation.RELATIVE_TO_SELF, 1f,
                Animation.RELATIVE_TO_SELF, 1f);
        mZZ_anim_scale.setDuration(animDuration);
        mZZ_anim_scale.setInterpolator(new DecelerateInterpolator());
        mZZ_anim_scale.setRepeatMode(Animation.RESTART);
        mZZ_anim_scale.setRepeatCount(Integer.MAX_VALUE);

        AlphaAnimation mZZ_anim_alpha = new AlphaAnimation(1, 0);
        mZZ_anim_alpha.setDuration(animDuration);
        mZZ_anim_alpha.setInterpolator(new DecelerateInterpolator());
        mZZ_anim_alpha.setRepeatMode(Animation.RESTART);
        mZZ_anim_alpha.setRepeatCount(Integer.MAX_VALUE);

        AnimationSet mZZ_animSet = new AnimationSet(true);
        mZZ_animSet.addAnimation(mZZ_anim_translate);
        mZZ_animSet.addAnimation(mZZ_anim_scale);
        mZZ_animSet.addAnimation(mZZ_anim_alpha);

        ImageView zzImg = (ImageView)m_rootLayout.findViewById(R.id.zz);
        zzImg.startAnimation(mZZ_animSet);
    }

    private final Runnable m_UiThreadStartLogo = new Runnable() {
        public void run() {
            m_Activity.addContentView(m_rootLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
    };

    private final Runnable m_UiThreadStopLogo = new Runnable() {
        public void run() {
            m_rootLayout.clearAnimation();
            ViewGroup vg = (ViewGroup) (m_rootLayout.getParent());
            vg.removeView(m_rootLayout);
            m_rootLayout = null;

            // add text view
            TextView text = new TextView(m_Activity);
            text.setText("End");
            text.setGravity(Gravity.CENTER);
            m_Activity.addContentView(text, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

            m_logoFinished = true;
        }
    };

    @Override
    public void onBackPressed() {
        AlertDialog.Builder builder = new AlertDialog.Builder(m_Activity);
        builder.setMessage("确定退出吗?");
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                m_Activity.finish();
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        if (m_logoFinished){
            builder.show();
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        if (m_videoView != null) {
            m_videoView.resume();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (m_videoView != null) {
            m_videoView.pause();
        }
    }
}

Android滑动动画ViewFlipper和视频播放VideoView的使用的更多相关文章

  1. Android 滑动效果入门篇(一)—— ViewFlipper

    ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放.又ViewAnimator继承至于Frame ...

  2. Android 实现左右滑动效果ViewFlipper终结【转】

    本示例演示在Android中实现图片左右滑动效果.   关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来 ...

  3. Android的Activity屏幕切换滑动动画

    Activity的切换效果使用的是Android的动画效果,Android的动画在官方有相关资料:http://developer.android.com/guide/topics/graphics/ ...

  4. android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码

    Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...

  5. Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画

    前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android An ...

  6. Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改)

    屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如 ...

  7. 十六、Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

  8. Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

  9. Xamarin.Android之动画

    Translate动画 这个动画是最常使用到的,主要就是将控件从一个位置移动到另一个位置,并且还可以在这其中增加一定的效果,下面我们将采用两种方式实现动画,首选的是利用XML来制作动画,其次就是利用代 ...

随机推荐

  1. Hibernate 多表关联

    hibernate中可以一次对多个表进行数据插入,这种插入类似 Hibernate的关联映射关系有:多对一 ---- many-to-one一对多 ---- one-to-many一对一 ---- o ...

  2. Android开发之EditText属性详解

    1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 ( ...

  3. 自定义View(2)canas绘制基本图形的示例

    效果 代码: void drawSample(Canvas canvas) { /* * 方法 说明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawP ...

  4. 面向对象设计Object Oriented Design

    http://www.codeproject.com/Articles/93369/How-I-explained-OOD-to-my-wife http://www.cnblogs.com/niyw ...

  5. 百度地图api经纬度气死我了!

      百度地图api经纬度气死我了! 百度地图官网api中例子的经纬度.我测试了2天才好用.一直是不能用.坑死我了.原来是获取的经纬度.和实际调用的经纬度尽然是反的.调转过来就好用了.气死我了.弄了两天 ...

  6. 1287. Mars Canals(DP)

    1287 水DP #include <iostream> #include<cstdio> #include<cstring> #include<algori ...

  7. treap完全版模板

    这是我综合poj1442 3481 2352的treap操作 得到treap完全版模板.(经测AC) 结构体Tree { int key; //键值 int size; //该子树总节点个数 int ...

  8. word编辑器解码集合

    $(document).ready(function () { $(".content").each(function () { var content = $(this).htm ...

  9. uva1262Password

    解码,暴力. 恬不知耻地把暴力题解放了上来,因为k比较小,直接暴力找到字符串第k大就可以了. 编码解码就是根据组合数学公式算出来它到底在哪. dfs返回bool就能使得找到字典序第k大字符串以后退出d ...

  10. 实现窗口逐渐增大(moveTo(),resizeTo(),resizeBy()方法)

    moveTo()方法格式:window.moveTo(x,y); 功能:将窗口移动到指定坐标(x,y)处; resizeTo()方法格式:window.resizeTo(x,y); 功能:将当前窗口改 ...