Android |
您所在的位置:网站首页 › 跟try很像的歌 › Android |
大纲
主要想实现的是在一个页面中播放一个动画、就像突然洒金币的效果。 我想要的效果是一个activity覆盖一个activity,并透明。 本文章主要讲如何在动画activity中播放gif动画:(第一种需要把gif转换成一帧一帧的格式,后两种方式是需要把gif--转换成mp4) 通过逐帧动画 内存泄漏、heap size 常识大小 -xms -xmx 通过webview播放 为了效果更好,应该对webview进行以下处理: webview背景透明 webview右下角缩放按钮 webview隐藏滚动条 屏幕单机、双击放大、滑动无响应事件 定时销毁动画activity webview屏幕适配 通过videoview播放(将gif--mp4) 自定义videoview 让播放布满整个屏幕 videoview隐藏进度条 videoview播放本地文件 获取res/raw的绝对地址 通过surfaceview播放(将gif--mp4) 学习地址:点这里 通过glide开源库直接播放gif 自行查阅 对于复杂动画大内存mp4 .gif 推荐使用https://github.com/airbnb/lottie-android com.airbnb.android:lottie这个库,让设计师将复杂view通过工具转成json形式,android客户端通过加载json方式加载动画,实现很多复杂动效。 大杀器Lottie:把AE动画转换成Android原生动画 这部分工作主要在设计师那里,但这种方式是最轻量切动画效果最好,能很好的播放各种炫酷动画 通过逐帧动画首先了解:android动画分类 逐帧播放应该是最简单的一种的,就是把连续的图片连起来播放,设置每帧的时间 有两种方式、一种是xml 一种是代码方式实现, 本例我选择代码方式,用一个imageview作为承载, // 核心代码如下: private AnimationDrawable anim; private ImageView imageView; private void init() { LayoutInflater inflater= (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.red_packets_frame_animation_view_layout,this); imageView=findViewById(R.id.imageView); anim=new AnimationDrawable(); } public void play_animation(){ for (int i=10;i4000){ //startTime = endTime; Message message=new Message(); message.what=0; handler.sendMessage(message); } } } .start(); } @Override public void onBackPressed() { super.onBackPressed(); webView.destroy(); finish(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_SCROLL: return true; case MotionEvent.ACTION_MOVE: return true; case MotionEvent.ACTION_POINTER_DOWN: return true; case MotionEvent.ACTION_MASK: return true; case MotionEvent.ACTION_DOWN: return true; default: break; } return super.dispatchTouchEvent(ev); } }记得设置activity透明,这样透明的gif的效果就浮现在另一个activity上,效果相对较好。 android:theme="@android:style/Theme.Translucent.NoTitleBar" 通过videoview播放因为videoview有默认尺寸,而我们想实现全屏动画,需要改变它默认大小 所以要重写相对方法,获得全屏尺寸 private int screenWidth; private int screenHeigh; //提供一个接口 让activity传入尺寸 public void setMetrics(int width,int height){ screenWidth=width; screenHeigh=height; } //重新绘制 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(screenWidth, screenHeigh); } //核心代码如下 public class AnimationActivity3 extends Activity { private GifVideoView gifVideoView; private MediaController mc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animation3); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int width=dm.widthPixels; int heigh=dm.heightPixels; gifVideoView=findViewById(R.id.gifVideoView); mc = new MediaController(this); mc.setVisibility(View.INVISIBLE); gifVideoView.setMetrics(width,heigh); gifVideoView.setBackgroundColor(0); gifVideoView.setMediaController(mc); Uri uri=Uri.parse( "android.resource://"+getPackageName()+"/"+R.raw.test); gifVideoView.setVideoURI(uri); gifVideoView.start(); gifVideoView.requestFocus(); //视频编码格式不支持的情况 gifVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mediaPlayer, int what, int extra) { if(what==MediaPlayer.MEDIA_ERROR_SERVER_DIED){ Log.v("view exception","Media Error,Server Died"+extra); }else if(what==MediaPlayer.MEDIA_ERROR_UNKNOWN){ Log.v("video exception","Media Error,Error Unknown "+extra); } return true; } }); } @Override public void onBackPressed() { super.onBackPressed(); finish(); } }小demo效果如图: Untitled.gif demo源码地址 留个赞吧鼓励一下。有什么建议或事好的想法可以私聊或评论,我也是初试了解这几种方式。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |