[文章]HarmonyOS应用开发-Doodle图像编辑主键体验

阅读量0
0
1
效果图如下所示:
2.png
该组件有画笔缩放,旋转等功能,可以自定义布局,掉用其接口完成图片编辑的功能。

部分代码:
  1. public class MainAbility extends Ability {
  2.     private static final int PERMISSION_REQUEST_INTERACTIVE = 1;
  3.     private static final int REQ_CODE_SELECT_IMAGE = 100;
  4.     private static final int REQ_CODE_DOODLE = 101;
  5.     private final static int mDuration = 20000;
  6.     private Text mPath;
  7.     private Image mSaveImg;
  8.     private DataAbilityHelper mHelper;
  9.     private boolean mIsOpenImageSelector = false;
  10.     private final static String mPermmReadMedia = "ohos.permission.READ_MEDIA";

  11.     @Override
  12.     public void onStart(Intent intent) {
  13.         super.onStart(intent);
  14.         setUIContent(ResourceTable.Layout_ability_main);
  15.         requestPermissionsFromUser(new String[]{SystemPermission.READ_USER_STORAGE,
  16.             SystemPermission.WRITE_USER_STORAGE, SystemPermission.READ_MEDIA, SystemPermission.WRITE_MEDIA,
  17.             SystemPermission.MEDIA_LOCATION}, PERMISSION_REQUEST_INTERACTIVE);
  18.         mSaveImg = (Image) findComponentById(ResourceTable.Id_img);
  19.         findComponentById(ResourceTable.Id_btn_select_image).setClickedListener(new Component.ClickedListener() {
  20.             @Override
  21.             public void onClick(Component component) {
  22.                 checkPermission();
  23.             }
  24.         });
  25.         findComponentById(ResourceTable.Id_btn_guide).setClickedListener(new Component.ClickedListener() {
  26.             @Override
  27.             public void onClick(Component component) {
  28.                 Intent intent = new Intent();
  29.                 Operation operation = new Intent.OperationBuilder()
  30.                     .withDeviceId("").withBundleName(getBundleName())
  31.                     .withAbilityName("com.example.doodledemo.guide.DoodleGuideAbility").build();
  32.                 intent.setOperation(operation);
  33.                 startAbility(intent);
  34.             }
  35.         });
  36.         findComponentById(ResourceTable.Id_btn_mosaic).setClickedListener(new Component.ClickedListener() {
  37.             @Override
  38.             public void onClick(Component component) {
  39.                 Intent intent = new Intent();
  40.                 Operation operation = new Intent.OperationBuilder()
  41.                     .withDeviceId("").withBundleName(getBundleName())
  42.                     .withAbilityName("com.example.doodledemo.MosaicDemo").build();
  43.                 intent.setOperation(operation);
  44.                 startAbility(intent);
  45.             }
  46.         });
  47.         findComponentById(ResourceTable.Id_btn_scale_gesture).setClickedListener(new Component.ClickedListener() {
  48.             @Override
  49.             public void onClick(Component component) {
  50.                 Intent intent = new Intent();
  51.                 Operation operation = new Intent.OperationBuilder()
  52.                     .withDeviceId("").withBundleName(getBundleName())
  53.                     .withAbilityName("com.example.doodledemo.ScaleGestureItemDemoAbility")
  54.                     .build();
  55.                 intent.setOperation(operation);
  56.                 startAbility(intent);
  57.             }
  58.         });
  59.         mPath = (Text) findComponentById(ResourceTable.Id_img_path);
  60.     }

  61.     private void checkPermission() {
  62.         if (verifySelfPermission(mPermmReadMedia) != IBundleManager.PERMISSION_GRANTED) {
  63.             // 应用未被授予权限
  64.             if (canRequestPermission(mPermmReadMedia)) {
  65.                 // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
  66.                 requestPermissionsFromUser(
  67.                     new String[]{mPermmReadMedia}, PERMISSION_REQUEST_INTERACTIVE);
  68.             }
  69.         } else {
  70.             if (!mIsOpenImageSelector) {
  71.                 Intent intent = new Intent();
  72.                 intent.setParam(ImageSelectorActivity.KEY_IS_MULTIPLE_CHOICE, false);
  73.                 intent.setParam(ImageSelectorActivity.KEY_MAX_COUNT, Integer.MAX_VALUE);
  74.                 Operation operation = new Intent.OperationBuilder()
  75.                     .withDeviceId("")
  76.                     .withBundleName(getBundleName())
  77.                     .withAbilityName("com.example.doodle.imagepicker.ImageSelectorActivity")
  78.                     .build();
  79.                 intent.setOperation(operation);
  80.                 mIsOpenImageSelector = !mIsOpenImageSelector;
  81.                 startAbilityForResult(intent, REQ_CODE_SELECT_IMAGE);
  82.             }
  83.         }
  84.     }

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

  94.     @Override
  95.     protected void onOrientationChanged(AbilityInfo.DisplayOrientation displayOrientation) {
  96.         super.onOrientationChanged(displayOrientation);
  97.     }

  98.     @Override
  99.     protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
  100.         super.onAbilityResult(requestCode, resultCode, resultData);
  101.         if (requestCode == REQ_CODE_SELECT_IMAGE) {
  102.             mIsOpenImageSelector = false;
  103.             if (resultData == null) {
  104.                 return;
  105.             }
  106.             if (resultCode == ImageSelectorActivity.RESULT_OK) {
  107.                 Intent intent = new Intent();
  108.                 Uri uri = resultData.getUri();
  109.                 intent.setUriAndType(uri, null);
  110.                 Operation operation = new Intent.OperationBuilder()
  111.                     .withDeviceId("")
  112.                     .withBundleName(getBundleName())
  113.                     .withAbilityName("com.example.doodle.DoodleAbility")
  114.                     .build();
  115.                 intent.setOperation(operation);
  116.                 startAbilityForResult(intent, REQ_CODE_DOODLE);
  117.             }
  118.         } else if (requestCode == REQ_CODE_DOODLE) {
  119.             if (resultData == null) {
  120.                 return;
  121.             }
  122.             if (resultCode == DoodleAbility.RESULT_OK) {
  123.                 Uri uri = resultData.getUri();
  124.                 String path = resultData.getStringParam(DoodleAbility.KEY_IMAGE_PATH);
  125.                 if (TextTool.isNullOrEmpty(path)) {
  126.                     return;
  127.                 }
  128.                 showSavePic(uri);
  129.                 mPath.setText(path);
  130.                 LogUtil.d("onAbilityResult", "path=" + path);
  131.             } else if (resultCode == DoodleAbility.RESULT_ERROR) {
  132.                 ToastDialog toastDialog = new ToastDialog(this);
  133.                 toastDialog.setText("error").setAlignment(1).setDuration(mDuration).show();
  134.             }
  135.         }
  136.     }

  137.     private void showSavePic(Uri uri) {
  138.         if (mHelper == null) {
  139.             mHelper = DataAbilityHelper.creator(getContext());
  140.         }
  141.         FileDescriptor filedesc = null;
  142.         try {
  143.             filedesc = mHelper.openFile(uri, "r");
  144.         } catch (DataAbilityRemoteException | FileNotFoundException e) {
  145.             e.getMessage();
  146.         }
  147.         ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();
  148.         decodingOpts.desiredSize = new Size(Util.getScreenWidth(this), Util.getScreenHeight(this));
  149.         ImageSource imageSource = ImageSource.create(filedesc, null);
  150.         PixelMap pixelMap = imageSource.createThumbnailPixelmap(decodingOpts, true);
  151.         mSaveImg.setPixelMap(pixelMap);
  152.     }
  153. }
复制代码
完整代码地址:


回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友