回复
HarmonyOS应用开发-Doodle图像编辑主键体验
鸿蒙时代
发布于 2022-2-26 14:26
浏览
0收藏
效果图如下所示:
该组件有画笔缩放,旋转等功能,可以自定义布局,掉用其接口完成图片编辑的功能。
部分代码:
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
收藏
回复
相关推荐