下载《安卓VS鸿蒙第三方件切换宝典》

由于字数较多,本文仅展示部分,查看完整版请点击上方下载

众所周知,安卓应用开发经过这么多年的发展相对成熟和稳定,鸿蒙OS作为后来者兼容一个成熟的开发体系会节省很多推广和开发成本。但在实际开发中,代码层面仍然有很多细节上的差异,会给初次开发人员造成困扰。

本宝典旨在汇总实际开发中第三方件接入时的代码差异,以期帮助开发人员更好的进行开发作业,由于目前接触的开发类型有限,所汇总的内容多少会有疏漏,后期我们会进一步完善和补全。

欢迎关注我们以及我们的专栏,方便您及时获得相关内容的更新。

※基础功能

1.获取屏幕分辨率

安卓:

  1. getWindowManager().getDefaultDisplay();

鸿蒙:

  1. Optional<Display>
  2. display = DisplayManager.getInstance().getDefaultDisplay(this.getContext());
  3. Point pt = new Point();
  4. display.get().getSize(pt);

2.隐藏标题栏TitleBar

安卓:

鸿蒙:

confi.json中添加如下描述:

  1. ""metaData"":{
  2. ""customizeData"":[
  3. {
  4. ""name"": ""hwc-theme"",
  5. ""value"": ""androidhwext:style/Theme.Emui.NoTitleBar"",
  6. ""extra"":""""
  7. }
  8. ]
  9. }

3.获取屏幕密度

安卓:

  1. Resources.getSystem().getDisplayMetrics().density

鸿蒙:

  1. // 获取屏幕密度
  2. Optional<Display>
  3. display = DisplayManager.getInstance().getDefaultDisplay(this.getContext());
  4. DisplayAttributes displayAttributes = display.get().getAttributes();
  5. //displayAttributes.xDpi;
  6. //displayAttributes.yDpi;

4.获取上下文

安卓:

  1. context

鸿蒙:

  1. getContext()

5.组件的父类

安卓:

  1. android.view.View; class ProgressBar extends View

鸿蒙:

  1. class ProgressBar extends Component

6.沉浸式显示

安卓:

鸿蒙:

A:在config.json ability 中添加

  1. "metaData"": {
  2. ""customizeData"": [
  3. {
  4. ""extra"": """",
  5. ""name"": ""hwc-theme"",
  6. ""value"": ""androidhwext:style/Theme.Emui.Light.NoTitleBar""
  7. }
  8. ]
  9. }

B:在AbilitySlice的onStart函数内增加如下代码,注意要在setUIContent之前。

  1. getWindow().addFlags(WindowManager.LayoutConfig.MARK_TRANSLUCENT_STATUS);

7.获取运行时权限

安卓:

  1. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1)

鸿蒙:

  1. requestPermissionsFromUser(
  2. new String[]{""ohos.permission.READ_MEDIA"", ""ohos.permission.WRITE_MEDIA"", ""ohos.permission.READ_USER_STORAGE"", ""ohos.permission.WRITE_USER_STORAGE"",}, 1);

※布局&组件

1.页面跳转(显示跳转)

安卓:

A.从A跳转至B,没有参数,并且不接收返回值

  1. Intent intent = new Intent();
  2. intent.setClass(A.this, B.class);
  3. startActivity(intent);

B.从A跳转至B,有参数,不接收返回值

  1. Intent intent = new Intent(this, B.class);
  2. intent.putExtra(""name"", ""lily"");
  3. startActivity(intent);

C.从A跳转至B,有参数,接收返回值

  1. Intent intent = new Intent(this, B.class);
  2. intent.putExtra(""name"", ""lily"");
  3. startActivityForResult(intent, 2);

鸿蒙:

A.从A跳转至B,没有参数,并且不接收返回值

  1. present(new BSlice(), new Intent());

B.从A跳转至B,有参数,不接收返回值

  1. Intent intent = new Intent();
  2. Operation operation = new Intent.OperationBuilder()
  3. .withDeviceId("""") .withBundleName(""com.test"") .withAbilityName(""com.test.BAbility"")
  4. .build();
  5. intent.setParam(""name"",""lily"");
  6. intent.setOperation(operation);
  7. startAbility(intent);

C.从A跳转至B,有参数,接收返回值

  1. Intent intent = new Intent();
  2. Operation operation = new Intent.OperationBuilder()
  3. .withDeviceId("""") .withBundleName(""com.test"") .withAbilityName(""com.test.BAbility"")
  4. .build();
  5. intent.setParam(""name"",""lily"");
  6. intent.setOperation(operation);
  7. startAbilityForResult(intent100);

2.页面跳转(隐式跳转)

安卓:

A.配置

  1. <activity android:name="".B"">
  2. <intent-filter>
  3. <action android:name=""com.hly.view.fling""/>
  4. </intent-filter>
  5. </activity>

B.启动

  1. Intent intent = new Intent(); intent.setAction(""com.hly.view.fling""); intent.putExtra(""key"", ""name""); startActivity(intent);

鸿蒙:

A.在config.json文件ability 中添加以下信息

  1. "skills"":[
  2. {
  3. ""actions"":[
  4. ""ability.intent.gotopage""
  5. ]
  6. }
  7. ]

B.在MainAbility的onStart函数中,增加页面路由

  1. addActionRoute( ""ability.intent.gotopage"", BSlice.class.getName());

C.跳转

  1. Intent intent = new Intent();
  2. intent.setAction(""ability.intent.gotopage"");
  3. startAbility(intent);

3.页面碎片

安卓:

Fragment

鸿蒙:

Fraction

A:Ability继承FractionAbility

B:获取Fraction调度器

  1. getFractionManager().startFractionScheduler()

C:构造Fraction

D:调用调度器管理Fraction

  1. FractionScheduler.add()
  2. FractionScheduler.remove()
  3. FractionScheduler.replace()

备注:

参考demo

https://www.jianshu.com/p/58558dc6673a"

4.从xml文件创建一个组件实例

安卓:

LayoutInflater.from(mContext).inflate(R.layout.banner_viewpager_layout, null);

鸿蒙:

LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_ability_main, null, false);

5.组件自定义绘制

安卓:

ImageView.setImageDrawable(Drawable drawable);

并重写Drawable 的draw函数

鸿蒙:

Component.addDrawTask(Component.DrawTask task);

并实现Component.DrawTask接口的onDraw函数

6.自定义组件的自定义属性(在xml中使用)

安卓:

需要3步

A.在 values/attrs.xml,在其中编写 styleable 和 item 等标签元素。

B.在layout.xml中,增加

xmln:app= ""http://schemas.android.com/apk/res/-auto""

C.在自定义组件的构造函数中,调用array.getInteger(R.styleable.***, 100);获取属性

鸿蒙:

只需2步

A. 在组件定义的layout.xml中增加 xmlns:app=""http://schemas.huawei.com/apk/res/ohos""

然后就可以使用app:***(***为任意字符串)来增加自定义属性了,为了区分建议加上组件名前缀。

B. 在自定义组件的带AttrSet参数的构造函数中,使用下面代码获取属性。attrSet.getAttr(""***"").get().getStringValue();

7.触摸事件

安卓:

android.view.MotionEvent

鸿蒙:

ohos.multimodalinput.event.TouchEvent

8.事件处理

安卓:

android.os.Handler

鸿蒙:

ohos.eventhandler.EventHandler

9.控件触摸事件回调

安卓:

android.view.View.OnTouchListener

鸿蒙:

  1. ohos.agp.components.Component.
  2. TouchEventListener

10.轮播图继承的父类

安卓:

extends ViewPager

鸿蒙:

extends PageSlider

11.实现监听轮播图组件事件

安卓:

implements PageSlider.PageChangedListener

鸿蒙:

Implements OnPageChangedListener

12.touch事件监听

安卓:

直接重写onTouchEvent

鸿蒙:

继承 Component.TouchEventListener然后在构造方法中设置监听  setTouchEventListener(this::onTouchEvent);实现onTouchEvent

13.获取点击事件的坐标点

安卓:

event.getX(), event.getY()

鸿蒙:

MmiPoint point = touchEvent.getPointerPosition(touchEvent.getIndex());

14.调节滚轮中内容间距

安卓:

setLineSpacingMultiplier(float f)

鸿蒙:

setSelectedNormalTextMarginRatio(float f)

15.滚轮定位

安卓:

setPosition

鸿蒙:

setValue

16.Layout布局改变监听

安卓:

View.OnLayoutChangeListener

鸿蒙:

Component.LayoutRefreshedListener

17.组件容器

安卓:

ViewGroup

鸿蒙:

ComponentContainer

18.添加组件

安卓:

addView()

鸿蒙:

addComponent()

19.动态列表的适配器

安卓:

extends RecyclerView.Adapter<>

鸿蒙:

extends RecycleItemProvider

20.动态列表

安卓:

RecyclerView

鸿蒙:

ListContainer

21.文本域动态监听

安卓:

TextWatcher

鸿蒙:

Component.ComponentStateChangedListener

22.组件绘制自定义布局

安卓:

重写onLayout(boolean changed, int left, int top, int right, int bottom)

鸿蒙:

重写Component.LayoutRefreshedListener的onRefreshed方法

23.List组件

安卓:

ListView

鸿蒙:

ListContainer

24.设置背景颜色

安卓:

setBackgroundColor(maskColor);

鸿蒙:

  1. // 创建背景元素
  2. ShapeElement shapeElement = new ShapeElement();
  3. // 设置颜色
  4. shapeElement.setRgbColor(new RgbColor(255, 0, 0));
  5. view.setBackground(shapeElement);

25.可以在控件上、下、左、右设置图标,大小按比例自适应

安卓:

setCompoundDrawablesWithIntrinsicBounds

鸿蒙:

setAroundElements

26.RadioButton组件在xml中如何设置checked属性

安卓:

在xml中可以设置

鸿蒙:

  1. radioButton = findComponentById();
  2. radioButton.setChecked(true);

备注:

sdk2.0后 xml中没有了checked属性,如果使用,可以在java代码中实现"

27.文本域动态监听

安卓:

TextWatcher

鸿蒙:

Component.ComponentStateChangedListener

28.颜色类

安卓:

java.awt.Color

鸿蒙:

ohos.agb.colors.rgbcolor

29.为ckeckbox或者Switch按钮设置资源图片

安卓:

鸿蒙:

  1. VectorElement vectorElement = new VectorElement(this, ResourceTable.Graphic_candy);
  2. setBackground(vectorElement)

30.子组件将拖拽事件传递给父组件

安卓:

鸿蒙:

注册setDraggedListener侦听,实现onDragPreAccept方法,再方法内根据拖拽方向判断是否需要父组件处理,如果需要则返回false,否则返回true

※资源管理

1.管理资源

安卓:

AssertManager

鸿蒙:

ResourceManager

2.获取应用的资源文件rawFile,并返回InputStream

安卓:

getResources()

AssetManager类

鸿蒙:

  1. ResourceManager resourceManager = getContext().getResourceManager();
  2. RawFileEntry rawFileEntry = resourceManager.getRawFileEntry(jsonFile);
  3. Resource resource = null;
  4. try {
  5. resource = rawFileEntry.openRawFile();
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }

备注:

Resource是InputStream的子类,可以直接作为InputStream使用。"

3.获取文件路径

安卓:

Environment.getExternalStorageDirectory().getAbsolutePath()

鸿蒙:

获取文档(DIRECTORY_DOCUMENTS)、下载(DIRECTORY_DOWNLOADS)、视频(DIRECTORY_MOVIES)、音乐(DIRECTORY_MUSIC)、图片(DIRECTORY_PICTURES)

GetExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath()

下载《安卓VS鸿蒙第三方件切换宝典》

作者:软通田可辉

想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

【资源下载】安卓VS鸿蒙第三方件切换宝典 V1.0的更多相关文章

  1. Jquery时间快捷控件(Jtime)配置v1.0

    1.脚本代码行 /** * @title 时间工具类 * @note 本类一律违规验证返回false * @author {boonyachengdu@gmail.com} * @date 2013- ...

  2. 鸿蒙第三方组件——SwipeCaptcha滑动拼图验证组件

    目录:1.组件效果展示2.Sample解析3.<鸿蒙第三方组件>系列文章合集 前言 基于安卓平台的滑动拼图验证组件SwipeCaptcha( https://github.com/mcxt ...

  3. android源码-安卓源码-Android源码下载-安卓游戏源码

    android源码   高仿精仿金山手机卫士应用源码V1.2 高仿精仿金山手机卫士应用源码,该应用的级别实现了金山卫士的级别功能了,可以说跟现实中我们使用的金山卫士应用的功能几乎差不 人气:9286  ...

  4. [移动网关]2G环境下资源下载有一定概率失败,客户端日志显示收到403错误

    2G环境下资源下载有一定概率失败,客户端日志显示收到403错误 问题现象: 测试同学在使用联通号码在移动网络环境下,访问连接得到的response_code出现是403,导致资源读取失败表情显示异常. ...

  5. 安卓自定义日期控件(仿QQ,IOS7)

    还记得上篇:高大上的安卓日期时间选择器,本篇是根据上篇修改而来,先看下qq中日期选择的效果: 鉴于目前还没有相似的开源日期控件,因此本人花费了一些时间修改了下之前的日期控件,效果如图: 虽说相似度不是 ...

  6. 《Android Studio开发实战 从零基础到App上线》资源下载和内容勘误

    转载于:https://blog.csdn.net/aqi00/article/details/73065392 资源下载 下面是<Android Studio开发实战 从零基础到App上线&g ...

  7. 海洋cms自带资源发布api插件和第三方资源站接入办法说明

    海洋cms自带资源发布api插件和第三方资源站接入办法说明 时间:2016-07-15 13:46 来源:CMS模版网 作者:大宇 阅读:7095次 ===海洋cms自带API资源发布插件说明===* ...

  8. .NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐) 快到2020年了 ...

  9. 对HTTP请求接口资源下载时间过长的问题分析

    问题描述 我司某产品线有指定业务接口customQuery在线上环境中,与首页一起打开时下载数据的时间明显过长(平均可以达到2s) 注: "与首页一起打开" 的含义是指用户进入WE ...

随机推荐

  1. labuladong 算法小抄

    <labuladong的算法小抄官方完整版> 本书目前可以手把手带你解决 110 道 LeetCode 算法问题,而且在不断更 新,全部基于 LeetCode 的题目,涵盖了所有题型和技巧 ...

  2. 手动合并hadoop namenode editlog

    一. 基本概念 1.NN恢复实际上是由fsimage开始(这个相当于数据的base),如果有多个fsimage,会自动选择最大的fsimage,然后按照editlog序列日志开始执行日志 2.seen ...

  3. Codeforces Round #646 (Div. 2) 题解 (ABCDE)

    目录 A. Odd Selection B. Subsequence Hate C. Game On Leaves D. Guess The Maximums E. Tree Shuffling ht ...

  4. ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015) G. It is all about wisdom (二分,单源最短路)

    题意:有\(n\)个点,\(m\)条边,只有当你的智力值大于这条边的\(w\)才能走,问在花费不超过\(k\)的情况下,从\(1\)走到\(n\)的所需的最小智力值. 题解:这题比赛为什么没想出来呢? ...

  5. Codeforces Round #650 (Div. 3) C. Social Distance (前缀和)

    题意:有一排座位,要求每人之间隔\(k\)个座位坐,\(1\)代表已做,\(0\)代表空座,问最多能坐几人. 题解:我们分别从前和从后跑个前缀和,将已经有人坐的周围的位置标记,然后遍历求每一段连续的\ ...

  6. 吉哥系列故事――恨7不成妻 HDU - 4507

    题目: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 ...

  7. Python 闭包及装饰器

    闭包是指延伸了作用域的函数. 自由变量(free variable) 指未在本地作用域中绑定的变量 函数装饰器用于在源码中标记函数, 以某种方式增强函数的行为. 装饰器实质,把被装饰的函数替换为新函数 ...

  8. 计算文件MD5

    计算文件MD5 def get_md5(file_path): md5 = None if os.path.exists(file_path): f = open(file_path, 'rb') m ...

  9. Service Cloud 零基础(四)快速配置一个问卷调查(无开发)

    本篇参考:https://trailhead.salesforce.com/content/learn/modules/survey-basics 我们在工作和生活中会经历过形形色色得调查问卷,有一些 ...

  10. Dapr 交通控制示例

    Dapr 已在塔架就位 将发射新一代微服务 牛年 dotnet云原生技术趋势 Dapr是如何简化微服务的开发和部署 前面几篇文章都是从大的方面给大家分享Dapr 能帮助我们解决什么问题,微软从开源到1 ...