mirror of
https://gitee.com/openharmony/arkui_ace_engine
synced 2024-11-23 15:10:30 +00:00
!42276 AddForMenuItem截图时机不合理,容易截到缩放动效期间的组件内容
Merge pull request !42276 from zhubingwei/master
This commit is contained in:
commit
ea9b113077
@ -22,36 +22,32 @@ const util = requireNapi('util');
|
||||
|
||||
const tag = 'AddFormMenuItem::js::';
|
||||
|
||||
async function querySnapshotAsync(want, componentId) {
|
||||
let compInfo = componentUtils.getRectangleById(componentId);
|
||||
async function querySnapshotAsync(want, componentId, uiContext) {
|
||||
let compInfo = uiContext.getComponentUtils().getRectangleById(componentId);
|
||||
try {
|
||||
const imagePackageApi = image.createImagePacker();
|
||||
const packOpts = {
|
||||
format: 'image/jpeg',
|
||||
quality: 50,
|
||||
};
|
||||
let packPixmap = await componentSnapshot.get(componentId);
|
||||
hilog.info(0x3900, tag, 'componentId:' + componentId);
|
||||
let packPixmap = await uiContext.getComponentSnapshot().get(componentId);
|
||||
let arrayBuffer = await imagePackageApi.packing(packPixmap, packOpts);
|
||||
let base64Helper = new util.Base64Helper();
|
||||
let uint8Arr = new Uint8Array(arrayBuffer);
|
||||
let pixelStr = base64Helper.encodeToStringSync(uint8Arr);
|
||||
|
||||
!want.parameters && (want.parameters = {});
|
||||
want.parameters['ohos.extra.param.key.add_form_to_host_width'] = compInfo.size.width.toFixed(2);
|
||||
want.parameters['ohos.extra.param.key.add_form_to_host_height'] = compInfo.size.height.toFixed(2);
|
||||
want.parameters['ohos.extra.param.key.add_form_to_host_screenx'] = compInfo.screenOffset.x.toFixed(2);
|
||||
want.parameters['ohos.extra.param.key.add_form_to_host_screeny'] = compInfo.screenOffset.y.toFixed(2);
|
||||
want.parameters['ohos.extra.param.key.add_form_to_host_snapshot'] = pixelStr;
|
||||
hilog.info(0x3900, tag, 'pixelStr length:' + pixelStr.length);
|
||||
} catch (err) {
|
||||
hilog.error(0x3900, tag, 'get pixelmap string error:' + err);
|
||||
}
|
||||
}
|
||||
|
||||
function querySnapshot(want, componentId) {
|
||||
querySnapshotAsync(want, componentId);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build function of AddFormMenuItem.
|
||||
*
|
||||
@ -62,18 +58,6 @@ function querySnapshot(want, componentId) {
|
||||
* @since 12
|
||||
*/
|
||||
export function AddFormMenuItem(want, componentId, options, parent = null) {
|
||||
this.observeComponentCreation2((elmtId, isInitialRender) => {
|
||||
If.create();
|
||||
if (querySnapshot(want, componentId)) {
|
||||
this.ifElseBranchUpdateFunction(0, () => {
|
||||
});
|
||||
}
|
||||
else {
|
||||
this.ifElseBranchUpdateFunction(1, () => {
|
||||
});
|
||||
}
|
||||
}, If);
|
||||
If.pop();
|
||||
this.observeComponentCreation2((elmtId, isInitialRender) => {
|
||||
FormMenuItem.create(options?.style?.options ? options.style.options : {
|
||||
startIcon: {
|
||||
@ -91,7 +75,14 @@ export function AddFormMenuItem(want, componentId, options, parent = null) {
|
||||
'moduleName': ''
|
||||
}
|
||||
});
|
||||
FormMenuItem.onRegClick(want, componentId, options?.formBindingData?.data, options?.callback);
|
||||
|
||||
let uiContext = this.getUIContext();
|
||||
FormMenuItem.onClick(async () => {
|
||||
await querySnapshotAsync(want, componentId, uiContext);
|
||||
uiContext.runScopedTask(() => {
|
||||
FormMenuItem.onRequestPublishFormWithSnapshot(want, options?.formBindingData?.data, options?.callback);
|
||||
});
|
||||
});
|
||||
}, FormMenuItem);
|
||||
FormMenuItem.pop();
|
||||
}
|
||||
|
@ -54,11 +54,13 @@ const querySnapshot = (want: Want, componentId: string): boolean => {
|
||||
|
||||
@Builder
|
||||
AddFormMenuItem(want: Want, componentId: string, options?: AddFormOptions): void {
|
||||
if (querySnapshot(want, componentId)) {
|
||||
}
|
||||
FormMenuItem(options?.style?.options ? options.style.options : {
|
||||
startIcon: $r('sys.media.ic_form_menu_add'),
|
||||
content: $r('sys.string.ohos_add_form_to_desktop')
|
||||
})
|
||||
.onRegClick(want, componentId, options?.formBindingData?.data, options?.callback)
|
||||
.onClick(async () => {
|
||||
let uiContext = this.getUIContext();
|
||||
await querySnapshot(want, componentId, uiContext);
|
||||
FormMenuItem.onRequestPublishFormWithSnapshot(want, options?.formBindingData?.data, options?.callback);
|
||||
})
|
||||
}
|
@ -39,19 +39,19 @@
|
||||
namespace OHOS::Ace::Framework {
|
||||
namespace {
|
||||
constexpr int NUM_WANT_1 = 0;
|
||||
constexpr int NUM_ID_2 = 1;
|
||||
constexpr int NUM_DATA_3 = 2;
|
||||
constexpr int NUM_FUN_4 = 3;
|
||||
constexpr int NUM_DATA_2 = 1;
|
||||
constexpr int NUM_FUN_3 = 2;
|
||||
constexpr int NUM_CALLBACKNUM = 2;
|
||||
}
|
||||
|
||||
|
||||
void JSFormMenuItem::JSBind(BindingTarget globalObj)
|
||||
{
|
||||
JSClass<JSFormMenuItem>::Declare("FormMenuItem");
|
||||
MethodOptions opt = MethodOptions::NONE;
|
||||
JSClass<JSFormMenuItem>::StaticMethod("create", &JSMenuItem::Create, opt);
|
||||
JSClass<JSFormMenuItem>::StaticMethod("onRegClick", &JSFormMenuItem::JsOnRegClick);
|
||||
JSClass<JSFormMenuItem>::StaticMethod("onClick", &JSInteractableView::JsOnClick);
|
||||
JSClass<JSFormMenuItem>::StaticMethod("onRequestPublishFormWithSnapshot",
|
||||
&JSFormMenuItem::JsOnRequestPublishFormWithSnapshot);
|
||||
JSClass<JSFormMenuItem>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
|
||||
JSClass<JSFormMenuItem>::InheritAndBind<JSViewAbstract>(globalObj);
|
||||
}
|
||||
@ -93,7 +93,7 @@ void JSFormMenuItem::RequestPublishFormWithSnapshot(JSRef<JSVal> wantValue,
|
||||
jsCBFunc->ExecuteJS(NUM_CALLBACKNUM, params);
|
||||
}
|
||||
|
||||
void JSFormMenuItem::JsOnRegClick(const JSCallbackInfo& info)
|
||||
void JSFormMenuItem::JsOnRequestPublishFormWithSnapshot(const JSCallbackInfo& info)
|
||||
{
|
||||
bool retFlag;
|
||||
OnClickParameterCheck(info, retFlag);
|
||||
@ -101,68 +101,33 @@ void JSFormMenuItem::JsOnRegClick(const JSCallbackInfo& info)
|
||||
return;
|
||||
}
|
||||
|
||||
std::string compId;
|
||||
JSViewAbstract::ParseJsString(info[NUM_ID_2], compId);
|
||||
if (compId.empty()) {
|
||||
TAG_LOGE(AceLogTag::ACE_FORM, "JsOnClick compId is empty.Input parameter componentId check failed.");
|
||||
auto want = info[NUM_WANT_1];
|
||||
JSRef<JSVal> wantValue = JSRef<JSVal>::Cast(want);
|
||||
if (wantValue->IsNull()) {
|
||||
TAG_LOGE(AceLogTag::ACE_FORM, "JsOnClick wantValue is null");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
std::string formBindingDataStr;
|
||||
JSViewAbstract::ParseJsString(info[NUM_DATA_3], formBindingDataStr);
|
||||
JSViewAbstract::ParseJsString(info[NUM_DATA_2], formBindingDataStr);
|
||||
if (formBindingDataStr.empty()) {
|
||||
TAG_LOGW(AceLogTag::ACE_FORM, "JsOnClick formBindingDataStr is empty");
|
||||
}
|
||||
|
||||
RefPtr<JsFunction> jsCallBackFunc = nullptr;
|
||||
if (!info[NUM_FUN_4]->IsUndefined() && info[NUM_FUN_4]->IsFunction()) {
|
||||
jsCallBackFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[NUM_FUN_4]));
|
||||
if (!info[NUM_FUN_3]->IsUndefined() && info[NUM_FUN_3]->IsFunction()) {
|
||||
jsCallBackFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[NUM_FUN_3]));
|
||||
}
|
||||
|
||||
WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
|
||||
|
||||
auto onTap = [execCtx = info.GetExecutionContext(), node = targetNode,
|
||||
jsCBFunc = std::move(jsCallBackFunc), want = info[NUM_WANT_1], formBindingDataStr] (GestureEvent& event) {
|
||||
JSRef<JSVal> wantValue = JSRef<JSVal>::Cast(want);
|
||||
if (wantValue->IsNull()) {
|
||||
TAG_LOGE(AceLogTag::ACE_FORM, "JsOnClick wantValue is null");
|
||||
return;
|
||||
}
|
||||
TAG_LOGI(AceLogTag::ACE_FORM, "JsOnClick ontap");
|
||||
JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
|
||||
ACE_SCORING_EVENT("onTap");
|
||||
RequestPublishFormWithSnapshot(wantValue, formBindingDataStr, jsCBFunc);
|
||||
#if !defined(PREVIEW) && defined(OHOS_PLATFORM)
|
||||
JSInteractableView::ReportClickEvent(node);
|
||||
#endif
|
||||
};
|
||||
|
||||
auto onClick = [execCtx = info.GetExecutionContext(), node = targetNode,
|
||||
jsCBFunc = std::move(jsCallBackFunc), want = info[NUM_WANT_1], formBindingDataStr]
|
||||
(const ClickInfo* event) {
|
||||
JSRef<JSVal> wantValue = JSRef<JSVal>::Cast(want);
|
||||
if (wantValue->IsNull()) {
|
||||
TAG_LOGE(AceLogTag::ACE_FORM, "JsOnClick wantValue is null");
|
||||
return;
|
||||
}
|
||||
JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
|
||||
ACE_SCORING_EVENT("onClick");
|
||||
PipelineContext::SetCallBackNode(node);
|
||||
RequestPublishFormWithSnapshot(wantValue, formBindingDataStr, jsCBFunc);
|
||||
#if !defined(PREVIEW) && defined(OHOS_PLATFORM)
|
||||
JSInteractableView::ReportClickEvent(node);
|
||||
#endif
|
||||
};
|
||||
ViewAbstractModel::GetInstance()->SetOnClick(std::move(onTap), std::move(onClick));
|
||||
RequestPublishFormWithSnapshot(wantValue, formBindingDataStr, jsCallBackFunc);
|
||||
}
|
||||
|
||||
void JSFormMenuItem::OnClickParameterCheck(const JSCallbackInfo& info, bool& retFlag)
|
||||
{
|
||||
retFlag = true;
|
||||
|
||||
if (info[NUM_WANT_1]->IsUndefined() || !info[NUM_WANT_1]->IsObject() || info[NUM_ID_2]->IsUndefined() ||
|
||||
!info[NUM_ID_2]->IsString()) {
|
||||
TAG_LOGE(AceLogTag::ACE_FORM, "OnClickParameterCheck bad parameter info[1] and info[2]");
|
||||
if (info[NUM_WANT_1]->IsUndefined() || !info[NUM_WANT_1]->IsObject()) {
|
||||
TAG_LOGE(AceLogTag::ACE_FORM, "OnClickParameterCheck bad parameter info[1]");
|
||||
return;
|
||||
}
|
||||
retFlag = false;
|
||||
|
@ -23,7 +23,7 @@ namespace OHOS::Ace::Framework {
|
||||
class JSFormMenuItem : public JSMenuItem {
|
||||
public:
|
||||
static void JSBind(BindingTarget globalObj);
|
||||
static void JsOnRegClick(const JSCallbackInfo& info);
|
||||
static void JsOnRequestPublishFormWithSnapshot(const JSCallbackInfo& info);
|
||||
static void OnClickParameterCheck(const JSCallbackInfo& info, bool& retFlag);
|
||||
private:
|
||||
static void RequestPublishFormWithSnapshot(JSRef<JSVal> wantValue,
|
||||
|
Loading…
Reference in New Issue
Block a user