安卓vs鸿蒙第三方件切换宝典V1.0(附载入)

众所周知,安卓应用开发经过这么多年的发展相对成熟和稳定,鸿蒙 OS 作为后来者兼容一个成熟的开发体系会节省很多推广和开发成本。但在实际开发中,代码层面仍然有很多细节上的差异,会给初次开发人员造成困扰。本宝典旨在汇总实际开发中第三方件接入时的代码差异,以及帮助开发人员更好的进行开发作业,由于目前接触的开发类型有限,所汇总的内容多少会有疏漏,后期我们会进一步完善和补全。

getWindowManager().getDefaultDisplay();Optional<Display> 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> display = DisplayManager.getInstance().getDefaultDisplay(this.getContext()); DisplayAttributes displayAttributes = display.get().getAttributes();//displayAttributes.xDpi;//displayAttributes.yDpi;04获取上下文android.view.View; class ProgressBar extends View鸿蒙:class ProgressBar extends Component06沉浸式显示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(this, new String[]{Manifest.permission.CALL_PHONE}, 1)鸿蒙:requestPermissionsFromUser( new String[]{""ohos.permission.READ_MEDIA"", ""ohos.permission.WRITE_MEDIA"", ""ohos.permission.READ_USER布局&组件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页面跳转<activity android:name="".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鸿蒙: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页面碎片A:Ability 继承 FractionAbilitygetFractionManager().startFractionScheduler()C:构造 FractionFractionScheduler.add()FractionScheduler.remove()FractionScheduler.replace()备注:参考 demo。https://www.jianshu.com/p/58558dc6673a04从 xml 文件创建一个组件实例LayoutInflater.from(mContext).inflate(R.layout.banner_viewpager_layout, null);鸿蒙:LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_ability_main, null, false);05组件自定义绘制ImageView.setImageDrawable(Drawable drawable);并重写 Drawable 的 draw 函数。Component.addDrawTask(Component.DrawTask task);并实现 Component.DrawTask 接口的 onDraw 函数。

06自定义组件的自定义属性(在xml中使用)A.在 values/attrs.xml,在其中编写 styleable 和 item 等标签元素。xmln:app= ""http://schemas.android.com/apk/res/-auto""C.在自定义组件的构造函数中,调用 array.getInteger(R.styleable.***, 100); 获取属性。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.TouchEvent08事件处理android.os.Handler鸿蒙:ohos.eventhandler.EventHandler09控件触摸事件回调android.view.View.OnTouchListener鸿蒙:ohos.agp.components.Component.TouchEventListener10轮播图继承的父类extends ViewPager鸿蒙:extends PageSlider11实现监听轮播图组件事件implements PageSlider.PageChangedListener鸿蒙:Implements OnPageChangedListener12touch 事件监听安卓:直接重写 onTouchEvent。鸿蒙:继承 Component.TouchEventListener,然后在构造方法中设置监听 setTouchEventListener(this::onTouchEvent); 实现 onTouchEvent。

event.getX(), event.getY()鸿蒙:MmiPoint point = touchEvent.getPointerPosition(touchEvent.getIndex());14调节滚轮中内容间距setLineSpacingMultiplier(float f)鸿蒙:setSelectedNormalTextMarginRatio(float f)15滚轮定位setValue16Layout 布局改变监听View.OnLayoutChangeListener鸿蒙:Component.LayoutRefreshedListener17组件容器ComponentContainer18添加组件addComponent()19动态列表的适配器extends RecyclerView.Adapter<>鸿蒙:extends RecycleItemProvider20动态列表ListContainer21文本域动态监听Component.ComponentStateChangedListener22组件绘制自定义布局安卓:重写 onLayout(boolean changed, int left, int top, int right, int bottom)。鸿蒙:重写 Component.LayoutRefreshedListener 的 onRefreshed 方法。setBackgroundColor(maskColor);鸿蒙:// 创建背景元素ShapeElement shapeElement = new ShapeElement();// 设置颜色shapeElement.setRgbColor(new RgbColor(255, 0, 0));view.setBackground(shapeElement);25可以在控件上、下、左、右设置图标,大小按比例自适应setCompoundDrawablesWithIntrinsicBounds鸿蒙:setAroundElements26RadioButton 组件在 xml 中如何设置 checked 属性radioButton = findComponentById();radioButton.setChecked(true);备注:sdk 2.0 后 xml 中没有了 checked 属性,如果使用,可以在 java 代码中实现。

Component.ComponentStateChangedListener28颜色类ohos.agb.colors.rgbcolor29为 ckeckbox 或者 Switch 按钮设置资源图片VectorElement vectorElement = new VectorElement(this, ResourceTable.Graphic_candy);setBackground(vectorElement)30子组件将拖拽事件传递给父组件鸿蒙:注册 setDraggedListener 侦听,实现 onDragPreAccept 方法,再方法内根据拖拽方向判断是否需要父组件处理,如果需要则返回 false,否则返回 true。ResourceManager02获取应用的资源文件 rawFile,并返回 InputStreamgetResources()AssetManager类鸿蒙:ResourceManager resourceManager = getContext().getResourceManager(); RawFileEntry rawFileEntry = resourceManager.getRawFileEntry(jsonFile); Resource resource = null; try { resource = rawFileEntry.openRawFile(); } catch (IOException e) { e.printStackTrace(); }备注:Resource 是 InputStream 的子类,可以直接作为 InputStream 使用。Environment.getExternalStorageDirectory().getAbsolutePath()鸿蒙:GetExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath()消息&多线程EventRunner.create(true)备注:有参数且为 true,表示队列被托管,参数为 false,或无参表示不被托管,需要 eventRunner.run() 调用。

android.os.Message鸿蒙:android.os.SystemClock.sleep()鸿蒙:ohos.miscservices.timeutility.time;Time.sleep(int millesend)04事件通知延迟消息Handler.postDelayed(MESSAGE_LOGIN, 5000);鸿蒙:Handler.postTask(task, 5000);05Intent 传递参数Intent.putExtra  or  add BundleIntent.setParam06消息发送安卓:Handler handler = new Handler,通过 handlerMsg 发消息。InnerEvent event1 = InnerEvent.get(eventId1, param, object);        myHandler.sendEvent(event1, 0, Priority.IMMEDIATE);07更新 UI class MyHandle extends Handler{        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case 1:                    //更新UI的操作                    break;                default:                    Break;            }        }    }abilitySlice.getUITaskDispatcher().asyncDispatch(() -> {    //更新UI的操作});图片处理ImageView.ScaleTypeimage.setScaleType(ScaleType.FXY);鸿蒙:Image.ScaleModeimage.setScaleMode(Image.ScaleMode.STRETCH);03List 组件&内容适配器ListViewextends BaeAdapterViewPage.setAdapter(BaeAdapter);鸿蒙:ListContainerextends PageSliderPageSlider.setProvider(PageSlider);04图片显示组件androidx.appcompat.widget.AppCompatImageViewBitmap bitmap = BitmapFactory.decodeResource(context.getResources(),drawableId);Image.setImageBitmap(bitmap);ohos.agp.components.ImageImageSource imageSource = ImageSource.create(file, new ImageSource.SourceOptions());pixelMap = imageSource.createPixelmap(new ImageSource.DecodingOptions());image.setPixelMap(pixelMap);05图片填充整个控件image.setScaleType(ScaleType.FXY);鸿蒙:

image.setScaleMode(Image.ScaleMode.STRETCH);06通过资源 id 获取位图getBitmapFromDrawable鸿蒙: /**     * 通过资源ID获取位图对象     **/    private PixelMap getPixelMap(int resId) {        InputStream drawableInputStream = null;        try {            drawableInputStream = getResourceManager().getResource(resId);            ImageSource.SourceOptions sourceOptions = new ImageSource.SourceOptions();            sourceOptions.formatHint = ""image/png"";            ImageSource imageSource = ImageSource.create(drawableInputStream, null);            ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions();            decodingOptions.desiredSize = new Size(0, 0);            decodingOptions.desiredRegion = new Rect(0, 0, 0, 0);            decodingOptions.desiredPixelFormat = PixelFormat.ARGB_8888;            PixelMap pixelMap = imageSource.createPixelmap(decodingOptions);            return pixelMap;        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (drawableInputStream != null) {                    drawableInputStream.close();                }            } catch (Exception e) {                e.printStackTrace();            }        }        return null;    }07获取 Gif 图片帧安卓:需要自定 frame 类,通过 decoder 获取。 ImageSource.createPixelmap(int index, ImageSource.DecodingOptions opts)08BMP 位图裁剪Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)鸿蒙:PixelMap.create(PixelMap source, Rect srcRegion, PixelMap.InitializationOptions opts)视频播放A.pinToTop 设置 false,保证其他控件与 surfaceProvider 在同一 layout 下,并且不能设置背景。

WindowManager.getInstance().getTopWindow().get().setTransparent(true);数据库android.database.Cursor;cursor.getString()/cursor.getColumnIndex()鸿蒙:ohos.data.resultset数据结构context.getContentResolver();resolver.getType(uri)鸿蒙:ohos.aafwk.ability.DataAbilityHelper 02JSON 解析import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import org.json.JSONTokener;android.os.Parcel;parcel.readParcelable();parcel.writeParcelable()鸿蒙:ohos.utils.parcel04浮点数矩形,获取中心点RectFloat.getCenter().getPointX()05数据结构类LongSparseArraySparseArrayCompat鸿蒙:使用 HashMap<Long,Ojbect> 和 HashMap<Integer,Ojbect> 替代。mDialog.destroy();02对话框中加载布局mDialog.setContentView(ViewGroup dialogView)鸿蒙:setContentCustomComponent(Componnet comp)03点击对话框外部关闭对话框mDialog.setCancelable(mPickerOptions.cancelable)鸿蒙: mDialog.setDialogListener(new BaseDialog.DialogListener() {                @Override                public boolean isTouchOutside() {                    mDialog.destroy();                dialogView.getComponentParent().removeComponent(dialogView);                    return true;                }            });备注:鸿蒙对话框销毁之后需移除对话框中加载的布局,否则再次加载会报错。android.view.animation.RotateAnimationohos.agp.animation.AnimatorProperty02值动画及相关回调android.animation.ValueAnimatorValueAnimator.AnimatorUpdateListenerAnimator.AnimatorListenerAnimator.AnimatorPauseListener鸿蒙:ohos.agp.animation.AnimatorValueAnimatorValue.ValueUpdateListenerAnimator.StateChangedListenerAnimator.LoopedListener备注:启动动画时,AnimatorValue 必须作为类的成员变量,而不能时函数局部变量,否则动画不会启动。

LinearInterpolator鸿蒙:自己写一个。public interface Interpolator {    float getInterpolation(float input);}public class LinearInterpolator implements Interpolator {    public LinearInterpolator() {    }    public LinearInterpolator(Context context, AttrSet attrs) {    }    public float getInterpolation(float input) {        return input;    }}04设置动画循环次数animation.setRepeatCount(Animation.INFINITE)鸿蒙:animator.setLoopedCount(Animator.INFINITE)存储Environment.getExternalStorageDirectory().getAbsolutePath();鸿蒙:System.getProperty("user.dir")Canvas 绘图Android canvas.drawArc()鸿蒙:ohos.agp.render; class Arc02绘制圆形的两种方式canvas.drawCircle(float x, float y, float radius, Paint paint)鸿蒙:A.canvas.drawPixelMapHolderRoundRectShape(PixelMapHolder holder, RectFloat rectSrc, RectFloat rectDst, float radiusX, float radiusY) B.canvas.drawCircle(float x, float y, float radius, Paint paint)03绘制文本的方法drawText (String text, float x, float y, Paint paint)鸿蒙:drawText(Paint paint, String text, float x, float y)04获取 text 的宽度原文链接:https://mp.weixin.qq.com/s/SrPaQuxiYJSQqPsQJMkDpA。

相关文章