HarmonyOS应用开发-Doodle图像编辑主键体验

鸿蒙时代
发布于 2022-2-26 14:26
浏览
0收藏

效果图如下所示:
HarmonyOS应用开发-Doodle图像编辑主键体验-鸿蒙开发者社区
该组件有画笔缩放,旋转等功能,可以自定义布局,掉用其接口完成图片编辑的功能。
部分代码:

public class MainAbility extends Ability {
    private static final int PERMISSION_REQUEST_INTERACTIVE = 1;
    private static final int REQ_CODE_SELECT_IMAGE = 100;
    private static final int REQ_CODE_DOODLE = 101;
    private final static int mDuration = 20000;
    private Text mPath;
    private Image mSaveImg;
    private DataAbilityHelper mHelper;
    private boolean mIsOpenImageSelector = false;
    private final static String mPermmReadMedia = "ohos.permission.READ_MEDIA";

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        setUIContent(ResourceTable.Layout_ability_main);
        requestPermissionsFromUser(new String[]{SystemPermission.READ_USER_STORAGE,
            SystemPermission.WRITE_USER_STORAGE, SystemPermission.READ_MEDIA, SystemPermission.WRITE_MEDIA,
            SystemPermission.MEDIA_LOCATION}, PERMISSION_REQUEST_INTERACTIVE);
        mSaveImg = (Image) findComponentById(ResourceTable.Id_img);
        findComponentById(ResourceTable.Id_btn_select_image).setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                checkPermission();
            }
        });
        findComponentById(ResourceTable.Id_btn_guide).setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                Intent intent = new Intent();
                Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("").withBundleName(getBundleName())
                    .withAbilityName("com.example.doodledemo.guide.DoodleGuideAbility").build();
                intent.setOperation(operation);
                startAbility(intent);
            }
        });
        findComponentById(ResourceTable.Id_btn_mosaic).setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                Intent intent = new Intent();
                Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("").withBundleName(getBundleName())
                    .withAbilityName("com.example.doodledemo.MosaicDemo").build();
                intent.setOperation(operation);
                startAbility(intent);
            }
        });
        findComponentById(ResourceTable.Id_btn_scale_gesture).setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                Intent intent = new Intent();
                Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("").withBundleName(getBundleName())
                    .withAbilityName("com.example.doodledemo.ScaleGestureItemDemoAbility")
                    .build();
                intent.setOperation(operation);
                startAbility(intent);
            }
        });
        mPath = (Text) findComponentById(ResourceTable.Id_img_path);
    }

    private void checkPermission() {
        if (verifySelfPermission(mPermmReadMedia) != IBundleManager.PERMISSION_GRANTED) {
            // 应用未被授予权限
            if (canRequestPermission(mPermmReadMedia)) {
                // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
                requestPermissionsFromUser(
                    new String[]{mPermmReadMedia}, PERMISSION_REQUEST_INTERACTIVE);
            }
        } else {
            if (!mIsOpenImageSelector) {
                Intent intent = new Intent();
                intent.setParam(ImageSelectorActivity.KEY_IS_MULTIPLE_CHOICE, false);
                intent.setParam(ImageSelectorActivity.KEY_MAX_COUNT, Integer.MAX_VALUE);
                Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("")
                    .withBundleName(getBundleName())
                    .withAbilityName("com.example.doodle.imagepicker.ImageSelectorActivity")
                    .build();
                intent.setOperation(operation);
                mIsOpenImageSelector = !mIsOpenImageSelector;
                startAbilityForResult(intent, REQ_CODE_SELECT_IMAGE);
            }
        }
    }

    @Override
    public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_INTERACTIVE) {
            if (!(grantResults.length > 0 && grantResults[0] == IBundleManager.PERMISSION_GRANTED)) {
                Toast.showLong(this, "请前往“设置”授予“存储访问权限”");
            }
        }
    }

    @Override
    protected void onOrientationChanged(AbilityInfo.DisplayOrientation displayOrientation) {
        super.onOrientationChanged(displayOrientation);
    }

    @Override
    protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
        super.onAbilityResult(requestCode, resultCode, resultData);
        if (requestCode == REQ_CODE_SELECT_IMAGE) {
            mIsOpenImageSelector = false;
            if (resultData == null) {
                return;
            }
            if (resultCode == ImageSelectorActivity.RESULT_OK) {
                Intent intent = new Intent();
                Uri uri = resultData.getUri();
                intent.setUriAndType(uri, null);
                Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("")
                    .withBundleName(getBundleName())
                    .withAbilityName("com.example.doodle.DoodleAbility")
                    .build();
                intent.setOperation(operation);
                startAbilityForResult(intent, REQ_CODE_DOODLE);
            }
        } else if (requestCode == REQ_CODE_DOODLE) {
            if (resultData == null) {
                return;
            }
            if (resultCode == DoodleAbility.RESULT_OK) {
                Uri uri = resultData.getUri();
                String path = resultData.getStringParam(DoodleAbility.KEY_IMAGE_PATH);
                if (TextTool.isNullOrEmpty(path)) {
                    return;
                }
                showSavePic(uri);
                mPath.setText(path);
                LogUtil.d("onAbilityResult", "path=" + path);
            } else if (resultCode == DoodleAbility.RESULT_ERROR) {
                ToastDialog toastDialog = new ToastDialog(this);
                toastDialog.setText("error").setAlignment(1).setDuration(mDuration).show();
            }
        }
    }

    private void showSavePic(Uri uri) {
        if (mHelper == null) {
            mHelper = DataAbilityHelper.creator(getContext());
        }
        FileDescriptor filedesc = null;
        try {
            filedesc = mHelper.openFile(uri, "r");
        } catch (DataAbilityRemoteException | FileNotFoundException e) {
            e.getMessage();
        }
        ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();
        decodingOpts.desiredSize = new Size(Util.getScreenWidth(this), Util.getScreenHeight(this));
        ImageSource imageSource = ImageSource.create(filedesc, null);
        PixelMap pixelMap = imageSource.createThumbnailPixelmap(decodingOpts, true);
        mSaveImg.setPixelMap(pixelMap);
    }
}

完整代码地址:
https://gitee.com/jltfcloudcn/jump_to/tree/master/Doodle图像编辑器

标签
HarmonyOS应用开发-Doodle图像编辑主键体验.docx 152.52K 12次下载
1
收藏
回复
举报
回复
    相关推荐