专栏名称: 51CTO技术栈
有趣 | 有料 | 有内涵,为您提供最优质的内容,愿我们一起悦享技术,成就人生。
目录
相关文章推荐
51好读  ›  专栏  ›  51CTO技术栈

太赞了!鸿蒙工程师必备宝典,提供下载

51CTO技术栈  · 公众号  · 程序员  · 2021-02-26 15:00

正文

众所周知,安卓应用开发经过这么多年的发展相对成熟和稳定,鸿蒙 OS 作为后来者兼容一个成熟的开发体系会节省很多推广和开发成本。


但在实际开发中,代码层面仍然有很多细节上的差异,会给初次开发人员造成困扰。


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


基础功能


01

获取屏幕分辨率


安卓:
getWindowManager().getDefaultDisplay();

鸿蒙:
Optional 
display = DisplayManager.getInstance().getDefaultDisplay(this.getContext());
Point pt = new Point();
display.get().getSize(pt);


02

隐藏标题栏 TitleBar


安卓: 略。


鸿蒙: confi.json 中添加如下描述。
 ""metaData"":{
        ""customizeData"":[
            {
                ""name""""hwc-theme"",
                ""value""""androidhwext:style/Theme.Emui.NoTitleBar"",
                ""extra"":""""
             }
        ]
    }

03

获取屏幕密度


安卓:
Resources.getSystem().getDisplayMetrics().density

鸿蒙:
// 获取屏幕密度
Optional 
display = DisplayManager.getInstance().getDefaultDisplay(this.getContext());        
DisplayAttributes displayAttributes = display.get().getAttributes();
//displayAttributes.xDpi;
//displayAttributes.yDpi;


04

获取上下文


安卓:
context

鸿蒙:
getContext()


05

组件的父类


安卓:

android.view.View; class ProgressBar extends View

鸿蒙:
class ProgressBar extends Component


06

沉浸式显示


安卓:略。


鸿蒙:两种方式。


A:在config.json ability 中添加。
"metaData"": {
  "
"customizeData"": [
    {
      "
"extra"": """",
      "
"name"": ""hwc-theme"",
      "
"value" ": ""androidhwext:style/Theme.Emui.Light.NoTitleBar""
    }
  ]
}

B:在 AbilitySlice 的 onStart 函数内增加如下代码,注意要在 setUIContent 之前。
getWindow().addFlags(WindowManager.LayoutConfig.MARK_TRANSLUCENT_STATUS);


07

获取运行时权限


安卓:

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


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


布局&组件


01

页面跳转(显示跳转)


安卓:


A.从 A 跳转至 B,没有参数,并且不接收返回值。
Intent intent = new Intent();
    intent.setClass(A.this, B.class);
    startActivity(intent);

B.从 A 跳转至 B,有参数,不接收返回值。
Intent intent = new Intent(this, B.class);
 intent.putExtra(""name""""lily"");
 startActivity(intent);

C.从 A 跳转至 B,有参数,接收返回值。
Intent intent = new Intent(this, B.class);
intent.putExtra(""name""""lily"");
startActivityForResult(intent, 2);

鸿蒙:


A.从 A 跳转至 B,没有参数,并且不接收返回值。
present(new BSlice(), new Intent());

B.从 A 跳转至 B,有参数,不接收返回值。
Intent intent = new Intent();
            Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("""")                   .withBundleName(""com.test"")                    .withAbilityName(""com.test.BAbility"")
                    .build();
            intent.setParam(""name"",""lily"");
            intent.setOperation(operation);
            startAbility(intent);

C.从 A 跳转至 B,有参数,接收返回值。
Intent intent = new Intent();
            Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("""")                    .withBundleName(""com.test"")                    .withAbilityName(""com.test.BAbility"")
                    .build();
            intent.setParam(""name"",""lily"");
            intent.setOperation(operation);
            startAbilityForResult(intent,100);


02

页面跳转(隐式跳转)


安卓:


A.配置
"".B"">
            <intent-filter>
                <action android:name=""com.hly.view.fling""/>
            intent-filter>
        activity>

B.启动
Intent intent = new Intent();               intent.setAction(""com.hly.view.fling"");                intent.putExtra(""key""""name"");                startActivity(intent);

鸿蒙:


A.在 config.json 文件 ability 中添加以下信息
"skills"":[
     {
        "
"actions"":[
            "
"ability.intent.gotopage""
            ]
    }
]

B.在 MainAbility 的 onStart 函数中,增加页面路由
addActionRoute( ""ability.intent.gotopage"", BSlice.class.getName());

C.跳转
Intent intent = new Intent();
            intent.setAction(""ability.intent.gotopage"");
            startAbility(intent);


03

页面碎片


安卓:Fragment。


鸿蒙:Fraction。


A:Ability 继承 FractionAbility


B:获取 Fraction 调度器
getFractionManager().startFractionScheduler()

C:构造 Fraction


D:调用调度器管理 Fraction
FractionScheduler.add()
FractionScheduler.remove()
FractionScheduler.replace()

备注:参考 demo。
https://www.jianshu.com/p/58558dc6673a


04

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


安卓:

LayoutInflater.from(mContext).inflate(R.layout.banner_viewpager_layoutnull);

鸿蒙:

LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_ability_mainnullfalse);


05

组件自定义绘制


安卓:
ImageView.setImageDrawable(Drawable drawable);

并重写 Drawable 的 draw 函数。


鸿蒙:
Component.addDrawTask(Component.DrawTask task);

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


06

自定义组件的自定义属性(在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();


07

触摸事件


安卓:
android.view.MotionEvent

鸿蒙:
ohos.multimodalinput.event.TouchEvent


08

事件处理


安卓:
android.os.Handler

鸿蒙:
ohos.eventhandler.EventHandler


09

控件触摸事件回调


安卓:
android.view.View.OnTouchListener

鸿蒙:
ohos.agp.components.Component.
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);

鸿蒙:
// 创建背景元素
ShapeElement shapeElement = new ShapeElement();
// 设置颜色
shapeElement.setRgbColor(new RgbColor(25500));
view.setBackground(shapeElement);


25

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


安卓:
setCompoundDrawablesWithIntrinsicBounds

鸿蒙:
setAroundElements


26

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


安卓:在 xml 中可以设置。


鸿蒙:
radioButton = findComponentById();
radioButton.setChecked(true);

备注:sdk 2.0 后 xml 中没有了 checked 属性,如果使用,可以在 java 代码中实现。


27

文本域动态监听


安卓:
TextWatcher

鸿蒙:
Component.ComponentStateChangedListener


28

颜色类


安卓:
java.awt.Color

鸿蒙:
ohos.agb.colors.rgbcolor


29

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


安卓:略。


鸿蒙:
VectorElement vectorElement = new VectorElement(this, ResourceTable.Graphic_candy);
setBackground(vectorElement)


30

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


安卓:略。


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


资源管理


01

管理资源


安卓:
AssertManager

鸿蒙:
ResourceManager


02







请到「今天看啥」查看全文