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

鸿蒙时代
发布于 2022-2-26 14:26
1024浏览
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);
    }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.

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

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


回复
    相关推荐