Shadow 插件化框架分析,万字总结

useHostContext: () -> Array
) : AbstractTransformManager(ctClassInputMap, classPool) {

override val mTransformList: List = listOf(
ApplicationTransform(),
ActivityTransform(),
ServiceTransform(),
InstrumentationTransform(),
RemoteViewTransform(),
FragmentTransform(ctClassInputMap),
DialogTransform(),
WebViewTransform(),
ContentProviderTransform(),
PackageManagerTransform(),
KeepHostContextTransform(useHostContext())
)
}

这里的 mTransformList 就是要依次执行的 Transform 内容,也就是需要替换的类映射。我们以 ApplicationTransform 和 ActivityTransform 为例。

class ApplicationTransform : SimpleRenameTransform(
mapOf(
“android.app.Application”
to “com.tencent.shadow.core.runtime.ShadowApplication”
,
“android.app.Application$ActivityLifecycleCallbacks”
to “com.tencent.shadow.core.runtime.ShadowActivityLifecycleCallbacks”
)
)

class ActivityTransform : SimpleRenameTransform(
mapOf(
“android.app.Activity”
to “com.tencent.shadow.core.runtime.ShadowActivity”
)
)

可以看到,打包过程中,插件的 Application 会被替换成 ShadowApplication,Activity 会被替换成 ShadowActivity,这里主要看一下 ShadowActivity 的继承关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为何插件 Activity 可以不用继承 Activity 呢?因为在代理 Activity 的方式中,插件 Activity 是被当作一个普通类来使用的,只要负责执行对应的生命周期即可。

宿主中如何启动插件 Activity

宿主中启动插件 Activity 原理如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们就从 sample 里的 MainActivity 开始看起。 sample-host/src/main/java/com/tencent/shadow/sample/host/MainActivity 是 demo 的主入口。
启动插件的方式是:

startPluginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// …
Intent intent = new Intent(MainActivity.this, PluginLoadActivity.class);
intent.putExtra(Constant.KEY_PLUGIN_PART_KEY, partKey);
intent.putExtra(Constant.KEY_ACTIVITY_CLASSNAME, “com.tencent.shadow.sample.plugin.app.lib.gallery.splash.SplashActivity”);
// …
startActivity(intent);
}
});

可以看到,这里是通过 PluginLoadActivity 来启动的,传入了要启动的插件 Activity:SplashActivity,接着就到 PluginLoadActivity 里看一下具体的启动。

class PluginLoadActivity extends Activity {
public void startPlugin() {
PluginHelper.getInstance().singlePool.execute(new Runnable() {
@Override

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中可以使用ShadowMap来实现阴影效果,并且可以通过阴影的颜色、透明度等参数来实现阴影的分析和变。以下是一个简单的实现步骤: 1.在Unity中创建一个场景,并将需要投射阴影的物体放置在场景中。 2.在场景中创建一个光源,并将其设置为投影模式。在光源的参数设置中,选择Shadow Type为Hard Shadows或Soft Shadows,并将Resolution设置为需要的大小。 3.在被投射阴影的物体上,将其接收阴影的属性设置为true。这可以通过在物体的Renderer组件中设置Cast Shadows为On,或者通过代码设置。 4.在阴影的Material中,可以设置颜色、透明度等参数来实现阴影的分析和变。例如,可以根据时间、位置等因素来改变阴影的颜色或透明度。 以下是一个示例代码,可以在Update函数中实现根据时间变阴影颜色的效果: ```csharp public class ShadowColor : MonoBehaviour { public Material shadowMaterial; //阴影的材质 public Color startColor; //开始颜色 public Color endColor; //结束颜色 public float duration = 2.0f; //变时长 private float startTime; //开始时间 void Start() { startTime = Time.time; } void Update() { float t = (Time.time - startTime) / duration; shadowMaterial.color = Color.Lerp(startColor, endColor, t); } } ``` 在该代码中,首先定义了阴影的材质和起始、结束颜色。然后,在Start函数中记录了开始时间,每帧根据时间变计算阴影颜色,最终将其赋值给阴影的材质。可以根据需要修改该代码来实现不同的阴影分析和变效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值