wifi共享大师没有联网元素动画需要联网的时候怎么才能达到性能最好

推荐课程8课后习题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
推荐课程8课后习题
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢深入理解Android L新特性之 页面内容&共享元素过渡动画 - 简书
深入理解Android L新特性之 页面内容&共享元素过渡动画
今天我们来聊聊Android L(5.0)引入的新特性:页面内容过渡动画和页面共享动画,这两个特性都是基于我们前面已经说过的Transition动画,如果你对Transition动画不太属性,请先看我前面的两篇文章。在5.0之前,我们从一个Activity A进入到另外一个Activity B时,如果需要设置一个动画,我们通常可以通过overridePendingTransition(int enterAnim, int exitAnim)来设置一个B的进入动画和A的退出动画,但是这个方式的缺点也很明显,我们设置的动画只能针对页面中所有元素。
在5.0以后为了提升Android在页面切换时更好的用户体验,页面间过渡动画应运而生,更加强大灵活的API为开发者提供了更多页面过渡的动画选择。本文的主要内容有:什么是内容过渡动画以及如何使用;什么是共享元素动画以及如何使用;两种动画的原理;最后说了两种共享元素常用场景的实现。
在开始所有内容之前,我首先要请大家树立一个基本原则:页面过渡动画是基于Transition动画来实现的!,文中的所有demo都可以从。ok,我们进入主题吧。
为了简化描述,我们首先定义一些标记,在Activity A打开Activity B这个场景中:
Activity A:我们称它为calling Activity,简称calling
Activity B:我们称为called Activity,以后简称called
calling-&called:用来描述calling打开called
called-&&calling:用来描述called返回到calling
在页面过渡中,我们有两种动画可以设置:1)页面内容过渡动画,指定整个页面的变化(类似于之前的overridePendingTransition);2)共享元素过渡动画,我们可以指定calling中的一些View平滑过渡到called页面中,下面我们分开讨论这两个东西。
页面内容过渡动画
在内容过渡动画中,我们可以指定四种动画,分别为exit(离开) enter(进入) return(返回) reenter(重新进入),分别对应于下图中的四种状态:
AE4DCAC7E070F68B2099.jpeg
可以看到 exit 和 reenter作用在calling Activity上,enter 和return作用在called Activity上。
和以前一样,我们还是先来一个简单的例子,再次安利一下,本系列文章中的代码都可以从这里
有人跟我反馈说文章中的gif不知道从哪里开始的,因为它是一直在重复,额从这个例子开始,我会在页面开始加一个begin的黑色页面,同时右下角有时间轴
content_transiton1.gif
我们前面定义过,calling表示第一个页面,called表示第二个页面。
calling-&called之后,calling执行了一个淡入淡出的动画,什么?不知道Fade!?,那你先去读一下我的。比如,我们在calling中可以直接这样指定:
Fade fade = new Fade();
getWindow().setExitTransition(fade);`
//指定退出动画
实际上,这里一共有四个动画:
calling exit: 一个淡出效果,通过Fade实现
called enter:一个从上往下的Slide效果
called return:从左往右消失
calling reenter:从底部往上出现
上面例子中,我们直接指定了四种动画效果。这四种效果是两两一对的:exit对应reenter,
enter对应return。如果我们只指定了exit或者enter,那么与这两个对应的另外一个动画将默认使用关联动画的反向执行。此外,还需要注意一点的是,上例中能够这么看清楚这四个动画的原因是我将动画叠加执行去掉了,你可以通过setAllowEnterTransitionOverlap改变这个设置。
注意,为了启动页面过渡效果,calling需要将startActivity(intent)改成调用startActivity(Intent intent, Bundle options),后面的options可以通过ActivityOptions.makeSceneTransitionAnimation(this).toBundle()来获取;在called中我们需要将调用finish()改成调用finishAfterTransition()
我们前面说了,这个页面过渡基于Transition来做的,那Transition动画无非就是两点呗:1)记录动画前后的视图树的状态变化;2)定义两个视图树之间的过渡效果。第二条我们前面已经分析过了,现在来看看系统是如何来记录两个场景的不同状态的。其实对于整个页面的进入和退出,系统采取的办法也很简单,以退出为例,在将calling真正隐藏之前,系统直接调用TransitionManager.beginDelayedTransition(decorView,exitTransition);,然后再调用decorView.setVisibility(INVISIBLE);,这样退出动画就自然执行了。是不是很简单??
这里其实说明了如果我们自己定义一个过渡动画,那么必须要处理View的可见性变化,因为只有处理了可见性变化才能触发动画,如果不明白这里,可以去查看我前面的文章。
共享元素动画
怎么描述共享元素动画呢?所谓共享就是calling中的一个view和called中的一个view可以做一个平滑的过渡,下面动图中的红色的小圆圈就是一个共享元素,在实际应用中,大家可以看一下微信朋友圈图片打开的动画就是一个典型的共享元素动画。
share_transiton.gif
如果仔细的朋友可以看到,我们不仅仅将view在两个页面间共享,而且在共享之前,我们有颜色变化的动画,这里也涉及了四个动画,和之前内容过渡一一对应。它们分别是
calling share exit: 颜色由红色变成绿色
called share enter:大小由小变大
called share return:大小由大变小
calling share reenter:颜色由绿色变成红色
我们来看一下如何来让两个页面之间的View做一个过渡:
在两个Activity的布局中为需要进行过渡变化的View设置android:transitionName,android:transitionName必须成对出现。
startActivity时,我们通过startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,view,transitionName).toBundle()); 关联两个Activity中间的View。
我在前面曾经让你想想看,我们startActivity的第二个参数的作用是啥,因为共享元素也是基于过渡动画来做的,而我们需要过渡的View又处在两个不同的Activity中,但是一个动画肯定不能在两个Activity中间无缝过渡,那系统是怎么做到的呢?其实着仅仅是一个障眼法而已,比如上面例子中,我们将一个View从calling移动到了called,但是实际上这个动画仅仅是在called中执行,而我们startActivity第二个参数的Bundle实际上是将calling中的共享元素的相关信息传递给called,called在进入时,会先吧这些共享元素的信息取出来,然后在直接操作当前视图树中相关联的View的属性和calling中元素一样,记录一下状态,再恢复成called本来的布局,记录一下状态,然后就可以愉快地开始动画了,真相就是这个样子。除了Activity,其实Android还提供了Fragment切换时进行页面过渡动画的相关API,和Android完全一致,这里就不去说明了。Material Design引入了很多UI的新技能,其实本人不太喜欢专研UI方面的东西,但是有时候产品需求压下来,还是得调研,多了解一些新的知识总归是好的。多谢大家关注这个Transition动画系列,到这里基本上就已经完全结束了,如果你觉得自己有一些收获,请点击底下的LIKE吧!
在分享元素实战应用中有两个比较重要的场景,官方文档对这个场景的解决方案并不明确,在这里补充一下。
补充一 更新共享元素对应关系
很多情况下,我们需要共享元素的页面满足下面的条件:calling是一个列表页面,called是一个详情页,我们在列表中选择一项打开,然后会有一个元素共享过渡到详情页,而我们在详情页是可以左右滑动切换元素的,如下图所示:
share_transiton000.gif
这个系统自带的相册APP,可以看到我们进入大图预览时,点击的是图片4,然后我们左右滑动,切换图片之后返回列表页,这个时候过渡动画直接返回到了图片1,那这是怎么做到的呢?
其实这里无非在过渡动画返回时,需要告诉系统,我的绑定关系改变了,我们可以在calling设置一个SharedElementCallback,然后在回调的onMapSharedElements更新一下对应关系,大概的逻辑代码如下:
setExitSharedElementCallback(new SharedElementCallback() {
public void onMapSharedElements(List&String& names, Map&String, View& sharedElements) {
super.onMapSharedElements(names, sharedElements);
sharedElements.put("avator",getItemByPosition(curentPos));
我们在celled中左右滑动修改了列表Index之后,需要通过某种方式告知calling,你可以通过startActivityForResult()也可以通过EventBus之类的第三方库,但是需要注意的是,onMapSharedElements在exit和reenter时都会触发!
延迟共享元素
想想这种场景吧,called中的共享元素在进入时,并没有到达最终的位置(比如这个数据需要从网络获取数据之后,才展示它真正的大小位置),此时如果过渡动画如果过早的执行,那么过渡动画获取的called中共享view的状态并不正确,所以我们有时候希望called中的共享元素完全layout完毕之后再执行,幸好API提供了支持。
在called的onCreate中我们可以这样处理:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 延迟共享动画的执行
postponeEnterTransition();
然后在共享元素的最终布局确定后,你可以执行startPostponedEnterTransition来启动共享元素动画,我们一般可以通过下面的工具方法来启动延迟动画:
private void scheduleStartPostponedTransition(final View sharedElement) {
sharedElement.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
//启动动画
sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
startPostponedEnterTransition();
但是使用延迟共享动画有两点需要注意:1. 调用postponeEnterTransition必须要在适当的时候调用startPostponedEnterTransition,否则Activity的过渡就会卡到这里,不能执行下去
2.基于1,我们在这两个方法间实际上也不能间隔太久(前面说的等待网络返回只是举个例子,不要在实际上使用等待网络返回的共享元素),如果间隔太大,那页面的过渡会直到调用startPostponedEnterTransition才能进行页面切换!同时发布在我的博客点此进入背景说来这个的背景非常简单,经常在使用图片列表的时候就会想,如果“列表中的图片放大到整个屏幕”作为 Activity 的补间动画,就非常完美了。就像这样:Android 5.0 Lollipop 的 SDK 发布以后,这个新的主题包含在 AppCompat-v7 21了。这里介绍的实现方法是 ActivityOptionsCompat.makeSceneTransitionAnimation , 缺点是只能在5.0上才可以看到效果,在5.0以下只能确保程序不出错。实现首先要在 AndroidManifest.xml 中为需要这种动画的 Activity 开启这个功能,为此我字节写了一个 style。&style name="AnimationActivity"&
&itemname="android:windowContentTransitions"&true&/item&
&/style&先来造一个浏览界面,关键是设置共享的视图元素的两个地方publicclassViewerActivityextendsAppCompatActivity {publicstaticvoidlaunch(AppCompatActivity activity, View transitionView, int resId) {
Intent intent = new Intent(activity, ViewerActivity.class);
intent.putExtra("resId", resId);
// 这里指定了共享的视图元素
ActivityOptionsCompat options = ActivityOptionsCompat
.makeSceneTransitionAnimation(activity, transitionView, "image");
ActivityCompat.startActivity(activity, intent, options.toBundle());
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewer);
ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setImageResource(getIntent().getIntExtra("resId", R.mipmap.pic_1));
// 这里指定了被共享的视图元素
ViewCompat.setTransitionName(imageView, "image");
}然后启动上边写好的浏览界面ViewerActivity.launch(MainActivity.this, v, data.get(position).resId);我知道上面写得比较简单,所以我就准备了,伸手党的福利:点我跳转代码地址更多上面的方法非常简单,但是却只能在 5.0 的版本上显示出效果,对于现在大部分手机还是 4.x 的情况来说,无疑是不能上线的。下一篇文章将会讨论如何在 4.x 上实现同样的效果,敬请期待。版权声明:本文为博主原创文章,未经博主允许不得转载。
以上就介绍了Android中Activity切换时共享视图元素的切换动画(50以上),包括了方面的内容,希望对Android开发有兴趣的朋友有所帮助。
本文网址链接:/article/detail_155114.html
上一篇: 下一篇:1971人阅读
【Android动画】(5)
下面是我实现的共享元素demo
1、在第一个界面为需要共享的view添加属性
android:transitionName=”transitionImg”
android:id="@+id/item_image"
android:layout_width="100dp"
android:layout_height="140dp"
android:layout_margin="10dp"
android:scaleType="centerCrop"
android:transitionName="transitionImg"/&
2、在第二个界面为需要共享的view添加属性
android:transitionName=”transitionImg”
android:id="@+id/detail_pic"
android:transitionName="transitionImg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"/&
注意,这里的属性名字需要一致
3、在第一个界面添加跳转
if (android.os.Build.VERSION.SDK_INT & 20) {
mThis.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(mThis, imgView, "transitionImg").toBundle())
mThis.startActivity(intent)
这样就实现了如上效果,但是如果需要创建多个共享元素,代码如下:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create(view1, "agreedName1"),
Pair.create(view2, "agreedName2"));
注意的问题
我在做项目的时候,比如上图中的图片,都是需要从网络获取的,两个界面虽然都是一张图片,但是却加载了2次,这个导致了一个问题,大家请看效果
问题出在哪里呢?我估计是出在缓存这块,因为用了一张本地的图片,加载效果就是好的。
所以我在每次点击的时候,将图片保存了下来,在第二个界面的时候再取出来,确保图片是同一张。
图片保存代码:
public static void SaveBitmap(Bitmap bitmap) {
LogCat.i("SaveBitmap")
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File saveFile = new File(sdCardDir + File.separator + NAME, IMG_NAME)
if (!saveFile.getParentFile().exists()) {
saveFile.getParentFile().mkdirs()
FileOutputStream outStream = new FileOutputStream(saveFile)
//第二个参数影响的是图片的质量,但是图片的宽度与高度是不会受影响滴
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream)
outStream.flush()
outStream.close()
} catch (FileNotFoundException e) {
e.printStackTrace()
} catch (IOException e) {
e.printStackTrace()
但是在保存图片的时候我又遇到了一些问题,我获取保存的bitmap的时候查了网上的一个方法:
imageview.setDrawingCacheEnabled(true)
Bitmap bm = Bitmap.createBitmap(imageview.getDrawingCache())
却发现取出来的图片比原来的模糊,后来换了个方法
Bitmap bm = ((BitmapDrawable)imgView.getDrawable()).getBitmap()
这样就好了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:101148次
积分:1821
积分:1821
排名:第17789名
原创:72篇
转载:15篇
评论:75条
欢迎大家加入我们的群:
(1)(1)(3)(3)(1)(1)(2)(5)(6)(3)(3)(6)(13)(6)(24)(3)(2)(5)(3)

我要回帖

更多关于 球铁性能达到800 8 的文章

 

随机推荐