App调用系统Camera拍照或者从Gallery选取图片,返回时先显示手机Launcher或者前一个界面,再跳转到当前activity

本文介绍了一种解决在使用透明主题时调用系统Camera或Gallery导致的闪屏问题的方法。通过为特定Activity设置非透明Theme来避免该现象。

原因:

为了避免黑色闪屏,给 Theme 设置了透明属性。

[html]  view plain  copy
  1. <style name="AppTheme" parent="android:Theme.Light.NoTitleBar">  
  2.       <item name="android:windowIsTranslucent">true</item>
  3. </style>  

给 Theme 设置透明属性后,启动App不会出现黑屏而是透明。但是在部分机型上,例如:Mate7 4.4,会出现标题中描述的问题。

解决方法:

为调用系统Camera或者Gallery的Activity,单独设置以下Theme。

[html]  view plain  copy
  1. <style name="AppXxxTheme" parent="AppTheme">  
  2.       <!--<item name="android:windowIsTranslucent">true</item>-->  //去掉
  3. </style>  


### 3.1 修改 Launcher3 负一屏布局并集成外部 App Activity 在 Android 的 Launcher3 中,负一屏通常是一个独立的 Fragment 或页面组件,负责展示推荐内容、快捷服务等信息。要实现将其替换为另一个 AppActivity,并支持左滑无缝跳转,需要从 UI 结构和启动流程两个层面进行改造。 首,在 UI 层面,Launcher3 的主界面通常是通过 `ViewSwitcher` 或 `ViewPager2` 实现多页切换的结构。可以将负一屏作为左侧的第一个页面嵌入到该结构中,并通过自定义 `FragmentStateAdapter` 来加载目标 Activity 的内容。例如: ```kotlin val viewPager: ViewPager2 = findViewById(R.id.viewPager) val adapter = object : FragmentStateAdapter(this) { override fun getItemCount(): Int = 2 override fun createFragment(position: Int): Fragment { return when (position) { 0 -> ExternalAppFragment() else -> HomeFragment() } } } viewPager.adapter = adapter ``` 此方式适用于基于 Fragment 架构的 Launcher3 实现,能够保证左右滑动的流畅性与一致性[^4]。 --- ### 3.2 使用 `ActivityOptions` 实现跨应用无缝跳转动画 为了实现丝滑的左滑跳转效果,可以在用户滑动至负一屏后,自动触发目标 AppActivity 启动流程。该过程需使用 `Intent` 携带目标包名与类名,并配合 `ActivityOptions.makeSceneTransitionAnimation()` 方法来创建共享元素过渡动画,从而增强视觉连续性。 ```java Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.targetapp", "com.example.targetapp.MainActivity")); ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this); startActivity(intent, options.toBundle()); ``` 该方法要求目标 App 的 Manifest 文件中声明了正确的 `launchMode` 和 `intent-filter`,以确保系统能正确解析并启动对应页面[^3]。 --- ### 3.3 自定义手势识别逻辑提升交互体验 除了依赖 ViewPager 提供的滑动机制,还可以通过注册 `OnTouchListener` 并结合 `GestureDetector.SimpleOnGestureListener` 来识别用户的左滑动作,并根据滑动方向启动新的 Activity 或执行动画过渡效果。 ```java public class MainActivity extends AppCompatActivity implements View.OnTouchListener { private GestureDetector gestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.container).setOnTouchListener(this); gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e1.getX() - e2.getX() > 100) { // 左滑操作,跳转到目标Activity startActivity(new Intent(MainActivity.this, TargetActivity.class)); overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); return true; } return false; } }); } @Override public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } } ``` 这种方式提供了更高的自由度,适合对滑动行为有定制化需求的应用场景[^2]。 --- ### 3.4 确保目标 App 支持外部调用 由于涉及跨应用跳转,必须确保目标 App 在其 `AndroidManifest.xml` 中声明了允许外部调用的 intent-filter。例如: ```xml <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="myapp" android:host="launcher" /> </intent-filter> </activity> ``` 这将使得 Launcher3 可以通过标准 Intent 启动该 App,并保持良好的兼容性与安全性[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值