实习笔记-7

FragmentActivity和Activity的具体区别在哪里

fragment是3.0以后的东西,为了在低版本中使用fragment就要用到android-support-v4.jar兼容包,fragmentActivity提供了操作fragment的一些方法,其功能跟3.0及以后的版本的Activity的功能一样。

  • 1、fragmentactivity 继承自activity,用来解决android3.0 之前没有fragment的api,所以在使用的时候需要导入support包,同时继承fragmentActivity,这样在activity中就能嵌入fragment来实现你想要的布局效果。
  • 2、当然3.0之后你就可以直接继承自Activity,并且在其中嵌入使用fragment了。
  • 3、获得Manager的方式也不同
    • 3.0以下:getSupportFragmentManager()
    • 3.0以上:getFragmentManager()(已弃用)

activity 转场动画

使用windowAnimation和ActivityAnimation

  • windowAnimation包含
    • windowEnterAnimation
    • windowExitAnimation
  • ActivityAnimation包含
    • android:activityOpenEnterAnimation
    • android:activityOpenExitAnimation
    • android:activityCloseEnterAnimation
    • android:activityCloseExitAnimation
  • 在项目中WindowAnimation的控制权大于Activity的控制权,即在Activity转场过程中,如果同时设置了WindowAnimation和ActivityAnimation,那么 可能(因为这种情况非常多) 只会执行WindowAnimation
  • 对于WindowAnimation的定义很简单,在style.xml文件中只需要继承Animation.Style即可

overridePendingTransition

  • 只能紧跟startActivity和finish之后调用

xml style

在values/styles.xml下

1
2
3
4
5
6
7
8
9
10
11
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="android:windowAnimationStyle">@style/myActivityOutEnterAnima</item>
</style>

<style name="myActivityOutEnterAnima" parent="@android:style/Animation.Activity">
<!-- 定义activity的进出场动画 -->
<item name="android:activityOpenEnterAnimation">@anim/enter_from_right</item>
<item name="android:activityOpenExitAnimation">@anim/out_to_left</item>
<item name="android:activityCloseEnterAnimation">@anim/enter_from_left</item>
<item name="android:activityCloseExitAnimation">@anim/out_to_right</item>
</style>

最后给Application/activity配置theme选项

5.0以后 内置Activity切换动画

常用参数

  • enter:用于决定第一次打开当前Activity时的动画
  • exit : 用于决定退出当前Activity时的动画
  • reenter: 用于决定如果当前Activity已经打开过,并且再次打开该Activity时的动画
  • shared elements:用于决定在两个Activity之间切换时,指定两个Activity中对应的View的过渡效果

步骤

1.在setContentView()之前执行,用于告诉Window页面切换需要使用动画接下来就是加载切换动画
1
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
2.加载切换动画
1
2
3
Transition explode = TransitionInflater
.from(this)
.inflateTransition(R.transition.explode);
3.告诉Window,当前的Activity在什么情况下使用上面的动画
1
2
3
getWindow().setExitTransition(explode);
getWindow().setEnterTransition(explode);
getWindow().setReenterTransition(explode);

或者在主题中添加

1
2
3
<item name="android:windowExitTransition">@transition/explode</item>
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowReenterTransition">@transition/explode</item>
4.调用startActivity时,将Transition变成bundle
1
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

使用内置动画

在res/transition目录下,新建xml文件

1
2
3
<explode  
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300" />
1
2
3
4
5
6
<slide
xmlns:android="http://schemas.android.com/apk/res/android"
android:slideEdge="end"
android:duration="300" />
<!--slideEdge表示起始滑动的侧边位置-->
<!-- start, end top,bottom -->

如果不希望状态栏,导航栏跟随一起执行动画,可以添加 target excludeId

1
2
3
4
5
6
7
8
9
<slide
xmlns:android="http://schemas.android.com/apk/res/android"
android:slideEdge="end"
android:duration="300">
<target android:excludeId="@android:id/navigationBarBackground"/>
<target android:excludeId="@android:id/statusBarBackground"/>
</slide>
<!--slideEdge表示起始滑动的侧边位置-->
<!-- start, end top,bottom -->
1
2
3
<fade    
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300" />

sharedElement效果

共享元素效果,与前面几种效果不同的是,共享元素效果是将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果

1.将两个Activity中需要过渡的View加上Android:transitionName属性

两个View的android:transitionName属性取值要一致

2.调用startActivity,makeTransitionAnimation时添加第二个参数–第一个Activity中的view对象,第三个参数–transitionName
1
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, SharedView, "TransitionName").toBundle())
添加多个view同时具有Transition过度切换效果

把SharedView和TransitionName组成一个Pair,依次穿给makeSceneTransitionAnimation

1
2
3
Pair first = new Pair<>(firstSharedView, ViewCompat.getTransitionName(firstSharedView));
Pair second = new Pair<>(secondSharedView, ViewCompat.getTransitionName(secondSharedView));
ActivityOptionsCompat.makeSceneTransitionAnimation(activity, first, second);

自定义过渡动画轨迹路径

1.创建一个View的过渡移动的轨迹路径PathMotion类
  • 我们可以创建ArcMotion对象,ArcMotion是PathMotion子类,是个曲线路径。想要了解更多ArcMotion可以查看:
  • ArcMotion官方文档
2.定义ChangeBounds类

我们自定义一个继承ChangeBounds的类,主要重写createAnimator函数,即创建你要执行的动画。这个函数由3个参数:

  • ViewGroup sceneRoot:屏幕根View,即DecorView,第二个Activity的DecorView。

  • TransitionValues startValues :属性动画的起始属性值,TransitionValues 对象内部有各Map类型的属性values,用于保存需要执行属性动画的属性。这个里面的属性值是在函数captureStartValues里放置,因此你可以重写captureStartValues函数,并把你自定义的属性动画中的属性放进去。

  • TransitionValues endValues:与startValues类似,表示属性动画结束时的属性值。可以通过重写captureEndValues函数,并把你自定义的属性动画里面的最终属性值放进去。

自动弹起软键盘

1
2
3
4
5
6
7
8
9
10
11
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
et.postDelayed({
runOnUiThread {
et.isFocusable = true
et.isFocusableInTouchMode = true
et.requestFocus()
et.findFocus()
val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT)
}
},300)

代码混淆

application 初始化减少

log 必须加debug

viewbinding

海外工作注意事项

  • 海外app开发时不能连公司wifi,必须断网,或者用4g
  • 不会的东西自己解决不了,大胆和同事请教和同事协调时间和进度。

心态上

  • 别人指出问题,有自己判断,要客观
作者

Meow Meow Liu

发布于

2022-03-22

更新于

2024-04-23

许可协议

评论