Android滑动动画ViewFlipper和视频播放VideoView的使用
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的使用的更多相关文章
- Android 滑动效果入门篇(一)—— ViewFlipper
ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放.又ViewAnimator继承至于Frame ...
- Android 实现左右滑动效果ViewFlipper终结【转】
本示例演示在Android中实现图片左右滑动效果. 关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来 ...
- Android的Activity屏幕切换滑动动画
Activity的切换效果使用的是Android的动画效果,Android的动画在官方有相关资料:http://developer.android.com/guide/topics/graphics/ ...
- android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码
Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...
- Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画
前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android An ...
- Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改)
屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如 ...
- 十六、Android 滑动效果汇总
Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...
- Android 滑动效果汇总
Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...
- Xamarin.Android之动画
Translate动画 这个动画是最常使用到的,主要就是将控件从一个位置移动到另一个位置,并且还可以在这其中增加一定的效果,下面我们将采用两种方式实现动画,首选的是利用XML来制作动画,其次就是利用代 ...
随机推荐
- (一)CSS三种插入方式
CSS概述 CSS(Cascading Style Sheets)指层叠样式表,样式定义了如何显示HTML元素. 样式通常存储在样式表中,样式与HTML分离解决了内容与表现分离的问题. 多个样式表可以 ...
- Android自动化测试之Monkeyrunner从零开始(三)
转自http://www.51testing.com/html/81/22381-854342.html 时光过得太快了,一晃离上一篇monkeyrunner系列的博客已经一年多了.这一年多时间经历了 ...
- poj 2411 Mondriaan's Dream(状态压缩dP)
题目:http://poj.org/problem?id=2411 Input The input contains several test cases. Each test case is mad ...
- MSSQL大全
一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...
- UVa 11181 (条件概率) Probability|Given
题意: 有n个人买东西,第i个人买东西的概率为Pi.已知最终有r个人买了东西,求每个人买东西的概率. 分析: 设事件E为r个人买了东西,事件Ei为第i个人买了东西.所求为P(Ei|E) = P(EiE ...
- 如何解决:新建Android程序的时候发生了找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 的错误
问题概述: 在新建Android程序的时候出现以下错误: 找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 原因: SDK不完整. 解决方法: 方法一 ...
- Java Web编程的主要组件技术——JSP
参考书籍:<J2EE开源编程精要15讲> JSP(Java Server Page)页面由HTML代码和嵌入其中的Java代码组成. 简单的JSP页面如: <html> < ...
- I.MX6 Linux udev porting
/*********************************************************************** * I.MX6 Linux udev porting ...
- MYSQL的分区字段,必须包含在主键字段内
MYSQL的分区字段,必须包含在主键字段内 MYSQL的分区字段,必须包含在主键字段内 在对表进行分区时,如果分区字段没有包含在主键字段内,如表A的主键为ID,分区字段为createtime ,按 ...
- (转)Linux上的Shebang符号(#!)
https://linux.cn/article-3664-1.html 本文了将给你简单介绍一下Shebang(”#!”)这个符号. 首先,这个符号(#!)的名称,叫做”Shebang”或者”Sha ...