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来制作动画,其次就是利用代 ...
随机推荐
- NSArray 初始化
//NSArray长度不可变所以初始化的时候就赋值,并且最后以nil结尾 //此外需要注意NSArray不能存放C语言的基础类型 NSObject *obj=[[NSObject alloc]init ...
- C++:虚基类
4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在 ...
- Builder创建者模式
http://www.codeproject.com/Articles/42415/Builder-Design-Pattern In Elizabeth's day care center, the ...
- bzoj2790
观察这道题,d(a,b) 就是先变成最大公约数然后再变成b 设g[x]表示x的质因数数目,不难得到d(a,b)=g[a/gcd(a,b)]+g[b/gcd(a,b)] 因为g[xy]=g[x]+g[y ...
- UVa 1347 (双线程DP) Tour
题意: 平面上有n个坐标均为正数的点,按照x坐标从小到大一次给出.求一条最短路线,从最左边的点出发到最右边的点,再回到最左边的点.除了第一个和最右一个点其他点恰好只经过一次. 分析: 可以等效为两个人 ...
- UVa 120 Stacks of Flapjacks【构造法】
题意:给出n张煎饼,从上到下输入,每张煎饼上面都有一个数字,厨师每次可以选择第k张煎饼,进行翻转操作,设计一种方法使得所有煎饼按照从小到大排序(最上面的煎饼最小) 首先是这个翻转的操作,如下图 如图所 ...
- HNOI2004宠物收养所(平衡树)
treap! var i,n,x,y,ans,a,b,root,tot,ft:longint; l,r,s,v,hr:..] of longint; procedure r_rotate(var x: ...
- windows2003 IIS6网络负载平衡设置
问题 随着计算机技术的不断发展,单台计算机的性能和可靠性越来越高.但现实中还是有许多应用是单台计算机难以达到,例如: 1.银行存储用户数据的数据库服务器必须保证24小时不间断的运转,并在发生严重硬件故 ...
- WinForm 禁止调整大小、禁止最大化窗口
这个设置代码必须添加到*.designer.cs中,就是自动隐藏的那部分: #region Windows Form Designer generated code 一般窗体设置的代码会生成到最后面, ...
- Azure SQL 数据库:服务级别与性能问答
ShawnBice 2014 年 5 月 5 日上午 10:00 几天前,我发表了一篇文章,并就 4 月 24 日发布的适用于Windows Azure SQL 数据库的新服务级别提供了一些预料 ...