harmonyos-best-practices-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -0
- package/data/docs/bpta-2in1-window-shape.md +296 -0
- package/data/docs/bpta-abckitts-implements-instrumentation.md +1279 -0
- package/data/docs/bpta-add-watermark.md +379 -0
- package/data/docs/bpta-ads-jump.md +67 -0
- package/data/docs/bpta-agent.md +472 -0
- package/data/docs/bpta-always-on-market-watch.md +703 -0
- package/data/docs/bpta-analysis-of-image-blurring.md +231 -0
- package/data/docs/bpta-analyze-memory-problem.md +17 -0
- package/data/docs/bpta-animation-frame.md +28 -0
- package/data/docs/bpta-antipeep-protection.md +291 -0
- package/data/docs/bpta-app-architecture-overview.md +25 -0
- package/data/docs/bpta-app-asset-protection-design.md +277 -0
- package/data/docs/bpta-app-code-ob.md +180 -0
- package/data/docs/bpta-app-concurrency-design.md +1189 -0
- package/data/docs/bpta-app-data-security.md +397 -0
- package/data/docs/bpta-app-icon-configuration.md +226 -0
- package/data/docs/bpta-app-privacy-protection.md +295 -0
- package/data/docs/bpta-application-aspect-programming-design.md +675 -0
- package/data/docs/bpta-application-cold-start-optimization.md +1397 -0
- package/data/docs/bpta-application-continue-progess.md +285 -0
- package/data/docs/bpta-application-gesture-share.md +468 -0
- package/data/docs/bpta-application-knock-file-share.md +263 -0
- package/data/docs/bpta-application-knock-video-share.md +552 -0
- package/data/docs/bpta-application-latency-optimization-cases.md +615 -0
- package/data/docs/bpta-application-power-analysis.md +15 -0
- package/data/docs/bpta-application-power-optimization.md +12 -0
- package/data/docs/bpta-application-power-test.md +52 -0
- package/data/docs/bpta-application-track-practice.md +595 -0
- package/data/docs/bpta-arkts-high-performance.md +464 -0
- package/data/docs/bpta-arkts-js-memory-analysis.md +111 -0
- package/data/docs/bpta-arkts-language.md +18 -0
- package/data/docs/bpta-arkweb-component-security.md +1134 -0
- package/data/docs/bpta-arkweb_rendering_framework.md +412 -0
- package/data/docs/bpta-aspect-implements-aop.md +505 -0
- package/data/docs/bpta-audio-and-video.md +30 -0
- package/data/docs/bpta-audio-cast.md +460 -0
- package/data/docs/bpta-audio-focus-management.md +862 -0
- package/data/docs/bpta-audio-in-ear-monitor.md +803 -0
- package/data/docs/bpta-audio-playback-series.md +16 -0
- package/data/docs/bpta-audio-record-base-on-audiocapturer.md +188 -0
- package/data/docs/bpta-audio-record-base-on-avrecorder-arkts.md +179 -0
- package/data/docs/bpta-audio-record-base-on-avrecorder.md +207 -0
- package/data/docs/bpta-audio-record-base-on-avscreencapture.md +165 -0
- package/data/docs/bpta-audio-record-base-on-ohaudio.md +162 -0
- package/data/docs/bpta-audio-record-overview.md +34 -0
- package/data/docs/bpta-audio-record.md +16 -0
- package/data/docs/bpta-audio-ripple-animation.md +198 -0
- package/data/docs/bpta-audio-video-synchronization.md +508 -0
- package/data/docs/bpta-audio-video.md +15 -0
- package/data/docs/bpta-automated-testing-frameworks.md +481 -0
- package/data/docs/bpta-avplayer-basic-control.md +533 -0
- package/data/docs/bpta-avplayer-embeded-network-video.md +486 -0
- package/data/docs/bpta-avplayer-embeded-short-video.md +512 -0
- package/data/docs/bpta-avplayer-long-video.md +907 -0
- package/data/docs/bpta-avplayer-short-video.md +158 -0
- package/data/docs/bpta-avplayer-video-practices.md +15 -0
- package/data/docs/bpta-avscreencapture-for-screen-recording.md +1121 -0
- package/data/docs/bpta-back-task-implement.md +317 -0
- package/data/docs/bpta-background-blur.md +316 -0
- package/data/docs/bpta-background-sensors-baned-analysis.md +93 -0
- package/data/docs/bpta-best-practices-long-list.md +891 -0
- package/data/docs/bpta-best-practices-overview.md +48 -0
- package/data/docs/bpta-bluetooth-low-energy.md +905 -0
- package/data/docs/bpta-buffer-mode-transcoding.md +728 -0
- package/data/docs/bpta-buffer-power-optimization.md +224 -0
- package/data/docs/bpta-camera-shot2see.md +368 -0
- package/data/docs/bpta-card-update-and-data-interaction.md +670 -0
- package/data/docs/bpta-carousel-graphic-works.md +379 -0
- package/data/docs/bpta-cell-phone.md +13 -0
- package/data/docs/bpta-click-to-click-response-optimization.md +264 -0
- package/data/docs/bpta-click-to-complete-delay-analysis.md +637 -0
- package/data/docs/bpta-collaboration-office.md +1178 -0
- package/data/docs/bpta-comment-reply-pop-up-window.md +523 -0
- package/data/docs/bpta-common-list-flows.md +688 -0
- package/data/docs/bpta-common-list-operations.md +828 -0
- package/data/docs/bpta-common-network-query.md +784 -0
- package/data/docs/bpta-comparative_practice_of_taskpool_and_worker.md +381 -0
- package/data/docs/bpta-compatible-scheme.md +11 -0
- package/data/docs/bpta-complex-type-pass.md +868 -0
- package/data/docs/bpta-component-nesting-optimization.md +421 -0
- package/data/docs/bpta-component-reuse-issue-diagnosis-and-analysis.md +637 -0
- package/data/docs/bpta-component-reuse.md +1258 -0
- package/data/docs/bpta-concurrency-capability.md +23 -0
- package/data/docs/bpta-concurrent-optimization.md +369 -0
- package/data/docs/bpta-content-creation.md +646 -0
- package/data/docs/bpta-continue-cast.md +702 -0
- package/data/docs/bpta-continue-data.md +335 -0
- package/data/docs/bpta-continue.md +1323 -0
- package/data/docs/bpta-control-rendering-range.md +29 -0
- package/data/docs/bpta-controlling-background-process-cpu.md +31 -0
- package/data/docs/bpta-crash-monitor-practice.md +116 -0
- package/data/docs/bpta-cross-domain-solutions-for-web-pages.md +308 -0
- package/data/docs/bpta-cross-end-migration.md +13 -0
- package/data/docs/bpta-cross-module-reference.md +406 -0
- package/data/docs/bpta-cross-platform-compatibility.md +321 -0
- package/data/docs/bpta-custom-camera-photo.md +454 -0
- package/data/docs/bpta-custom-camera-preview.md +1170 -0
- package/data/docs/bpta-custom-camera-video.md +322 -0
- package/data/docs/bpta-custom-font-settings.md +354 -0
- package/data/docs/bpta-custom-hvigor-plugin.md +159 -0
- package/data/docs/bpta-custom-keyboard.md +519 -0
- package/data/docs/bpta-customdialog-selection-and-development.md +406 -0
- package/data/docs/bpta-dark-mode-adaptation.md +321 -0
- package/data/docs/bpta-deal-stride-solution.md +261 -0
- package/data/docs/bpta-decrease_pakage_size.md +126 -0
- package/data/docs/bpta-delayed-trigger-operation.md +215 -0
- package/data/docs/bpta-desktop-shortcuts.md +180 -0
- package/data/docs/bpta-detection.md +12 -0
- package/data/docs/bpta-developing-high-performance-ui.md +19 -0
- package/data/docs/bpta-development-scenarios-for-tabs.md +934 -0
- package/data/docs/bpta-dialog-encapsulation.md +201 -0
- package/data/docs/bpta-dispose-highly-loaded-component-render.md +352 -0
- package/data/docs/bpta-distribute-drag-cast.md +60 -0
- package/data/docs/bpta-distributed-pasteboard-cast.md +88 -0
- package/data/docs/bpta-distributed-pasteboard.md +314 -0
- package/data/docs/bpta-drawing-capability-improve-performance.md +436 -0
- package/data/docs/bpta-dynamic-link-library.md +272 -0
- package/data/docs/bpta-easygo-parallel.md +402 -0
- package/data/docs/bpta-fair-use-animation.md +1693 -0
- package/data/docs/bpta-file-transmission-based-on-sfft.md +265 -0
- package/data/docs/bpta-file-upload-and-download-performance.md +484 -0
- package/data/docs/bpta-foldable-guide.md +205 -0
- package/data/docs/bpta-folded-hover.md +202 -0
- package/data/docs/bpta-form-kit.md +12 -0
- package/data/docs/bpta-frontend-invisible-animation-analysis.md +187 -0
- package/data/docs/bpta-full-scenario-collaborative-development.md +13 -0
- package/data/docs/bpta-fuzzy-scene-performance-optimization.md +256 -0
- package/data/docs/bpta-game-prelaunch-practice.md +175 -0
- package/data/docs/bpta-general-comments.md +17 -0
- package/data/docs/bpta-gestures-practice.md +619 -0
- package/data/docs/bpta-global-state-management-state-store.md +472 -0
- package/data/docs/bpta-gpu-acceleration-practices.md +11 -0
- package/data/docs/bpta-graphic-drawing-practices.md +13 -0
- package/data/docs/bpta-grid-based-on-scrollcomponents.md +1112 -0
- package/data/docs/bpta-grid-drag-swap.md +725 -0
- package/data/docs/bpta-hadss_dialoghub.md +786 -0
- package/data/docs/bpta-harmony-application-security.md +1253 -0
- package/data/docs/bpta-hdrtosdr.md +439 -0
- package/data/docs/bpta-hdrvivid.md +700 -0
- package/data/docs/bpta-high-cpu-load-analysis.md +113 -0
- package/data/docs/bpta-high-performance-json-parsing.md +263 -0
- package/data/docs/bpta-high-performance-protobuf-parsing.md +259 -0
- package/data/docs/bpta-hmos-live-stream-audio-call.md +140 -0
- package/data/docs/bpta-hmos-live-stream-solution.md +495 -0
- package/data/docs/bpta-hmrouter.md +659 -0
- package/data/docs/bpta-hopping.md +60 -0
- package/data/docs/bpta-hwc-self-rendering-layer-analysis.md +77 -0
- package/data/docs/bpta-image-processing-practices.md +13 -0
- package/data/docs/bpta-image-to-video-synthesis.md +459 -0
- package/data/docs/bpta-image-white-lump-solution.md +282 -0
- package/data/docs/bpta-image_get_and_save.md +120 -0
- package/data/docs/bpta-implement-timeline-based-on-canvas.md +493 -0
- package/data/docs/bpta-implementing-image-filters.md +406 -0
- package/data/docs/bpta-implementing-image-resizable.md +270 -0
- package/data/docs/bpta-improve-layout-performance.md +547 -0
- package/data/docs/bpta-improve-running-efficiency.md +187 -0
- package/data/docs/bpta-improve_grid_performance.md +268 -0
- package/data/docs/bpta-input-method-framework.md +12 -0
- package/data/docs/bpta-intent-recommend-practice.md +313 -0
- package/data/docs/bpta-js-leak-watcher.md +153 -0
- package/data/docs/bpta-kernel-memory-analysis.md +38 -0
- package/data/docs/bpta-keyboard-layout-adapt.md +725 -0
- package/data/docs/bpta-landscape-and-portrait-development.md +947 -0
- package/data/docs/bpta-layered-architecture-design.md +82 -0
- package/data/docs/bpta-lazyforeach-optimization.md +217 -0
- package/data/docs/bpta-link-between-apps-overview.md +99 -0
- package/data/docs/bpta-list-based-on-scrollcomponents.md +1643 -0
- package/data/docs/bpta-lite-wearable-guide.md +1899 -0
- package/data/docs/bpta-live-form-development-practice.md +544 -0
- package/data/docs/bpta-live-streaming-optimization.md +397 -0
- package/data/docs/bpta-local-file-and-data-multithreaded-io.md +367 -0
- package/data/docs/bpta-local-file.md +11 -0
- package/data/docs/bpta-lock-screen-immersive-live-window.md +473 -0
- package/data/docs/bpta-long-snapshot-practice.md +1046 -0
- package/data/docs/bpta-low-power-consumption-of-background-tasks.md +14 -0
- package/data/docs/bpta-low-power-consumption-of-foreground-tasks.md +14 -0
- package/data/docs/bpta-low-power-design-in-dark-mode.md +418 -0
- package/data/docs/bpta-ltpo-description.md +323 -0
- package/data/docs/bpta-maleoon-gpu-best-practices.md +1297 -0
- package/data/docs/bpta-malloc-dispatch-table.md +144 -0
- package/data/docs/bpta-managing-audio-input-devices.md +350 -0
- package/data/docs/bpta-managing-audio-output-devices.md +399 -0
- package/data/docs/bpta-mate-book-fold.md +229 -0
- package/data/docs/bpta-matetv-guide.md +223 -0
- package/data/docs/bpta-matext-guide.md +269 -0
- package/data/docs/bpta-memory-basic-knowledge.md +71 -0
- package/data/docs/bpta-memory-optimization.md +545 -0
- package/data/docs/bpta-modular-design.md +282 -0
- package/data/docs/bpta-multi-device-adaptive-layout.md +775 -0
- package/data/docs/bpta-multi-device-adaptive.md +11 -0
- package/data/docs/bpta-multi-device-camera.md +584 -0
- package/data/docs/bpta-multi-device-collaboration.md +19 -0
- package/data/docs/bpta-multi-device-component-layout.md +190 -0
- package/data/docs/bpta-multi-device-design-principles.md +26 -0
- package/data/docs/bpta-multi-device-function.md +99 -0
- package/data/docs/bpta-multi-device-hardware.md +12 -0
- package/data/docs/bpta-multi-device-ide.md +124 -0
- package/data/docs/bpta-multi-device-interaction.md +11 -0
- package/data/docs/bpta-multi-device-layout-overview.md +47 -0
- package/data/docs/bpta-multi-device-overview.md +340 -0
- package/data/docs/bpta-multi-device-page-layout.md +699 -0
- package/data/docs/bpta-multi-device-page.md +19 -0
- package/data/docs/bpta-multi-device-resource.md +122 -0
- package/data/docs/bpta-multi-device-responsive-layout.md +1274 -0
- package/data/docs/bpta-multi-device-responsive.md +14 -0
- package/data/docs/bpta-multi-device-screen-diff.md +197 -0
- package/data/docs/bpta-multi-device-screen-layout.md +834 -0
- package/data/docs/bpta-multi-device-start.md +376 -0
- package/data/docs/bpta-multi-device-ui-development.md +27 -0
- package/data/docs/bpta-multi-device-window-direction.md +1322 -0
- package/data/docs/bpta-multi-device-window-immersive.md +364 -0
- package/data/docs/bpta-multi-device-window-mode.md +1293 -0
- package/data/docs/bpta-multi-device-window.md +13 -0
- package/data/docs/bpta-multi-device.md +13 -0
- package/data/docs/bpta-multi-interaction.md +368 -0
- package/data/docs/bpta-multi-mobile-payment.md +282 -0
- package/data/docs/bpta-multi-music-app-overview.md +365 -0
- package/data/docs/bpta-multi-settings-application-page.md +163 -0
- package/data/docs/bpta-multi-tab-practice.md +750 -0
- package/data/docs/bpta-multi-target.md +490 -0
- package/data/docs/bpta-multi-window-practice.md +795 -0
- package/data/docs/bpta-multi_game.md +472 -0
- package/data/docs/bpta-music-card.md +1916 -0
- package/data/docs/bpta-music-playback-scenarios.md +120 -0
- package/data/docs/bpta-native-memory-analysis.md +101 -0
- package/data/docs/bpta-native-sub-main-comm.md +323 -0
- package/data/docs/bpta-navigation-scenarios.md +69 -0
- package/data/docs/bpta-network-ca-security.md +241 -0
- package/data/docs/bpta-network-reconnection.md +327 -0
- package/data/docs/bpta-network-resources.md +24 -0
- package/data/docs/bpta-news-reading.md +12 -0
- package/data/docs/bpta-news_homepage.md +449 -0
- package/data/docs/bpta-object-serialization-performance.md +12 -0
- package/data/docs/bpta-one-shot-to-the-end.md +932 -0
- package/data/docs/bpta-online-video-playback-lags-practice.md +298 -0
- package/data/docs/bpta-optimization-overview.md +227 -0
- package/data/docs/bpta-optimization-tool-practice.md +20 -0
- package/data/docs/bpta-package-structure.md +13 -0
- package/data/docs/bpta-pad-guide.md +268 -0
- package/data/docs/bpta-page-brightness-settings.md +256 -0
- package/data/docs/bpta-page-transition.md +583 -0
- package/data/docs/bpta-pc-guide.md +438 -0
- package/data/docs/bpta-pc.md +12 -0
- package/data/docs/bpta-perceived-smoothness.md +49 -0
- package/data/docs/bpta-performance-detection.md +160 -0
- package/data/docs/bpta-performance-guide-reading.md +50 -0
- package/data/docs/bpta-performance-mainthread-consumption-detection.md +11 -0
- package/data/docs/bpta-performance-optimization.md +23 -0
- package/data/docs/bpta-performance-runtime-detection.md +13 -0
- package/data/docs/bpta-performance-sliding-frame-drop-detection.md +19 -0
- package/data/docs/bpta-performance-startup-time-detection.md +13 -0
- package/data/docs/bpta-permission-application.md +318 -0
- package/data/docs/bpta-permission-timeout-analysis.md +51 -0
- package/data/docs/bpta-photo.md +15 -0
- package/data/docs/bpta-picture-preview.md +464 -0
- package/data/docs/bpta-picture.md +12 -0
- package/data/docs/bpta-playing-formatted-audio-based-avplayer-arkts.md +481 -0
- package/data/docs/bpta-playing-formatted-audio-based-avplayer-cpp.md +593 -0
- package/data/docs/bpta-playing-pcm-audio-based-audiorenderer.md +959 -0
- package/data/docs/bpta-playing-pcm-audio-based-ohaudio.md +599 -0
- package/data/docs/bpta-playing-short-audio-based-soundpool.md +182 -0
- package/data/docs/bpta-positioning.md +364 -0
- package/data/docs/bpta-power-basic-quality-test.md +35 -0
- package/data/docs/bpta-power-consumption-analysis.md +12 -0
- package/data/docs/bpta-power-consumption-develop-analysis.md +12 -0
- package/data/docs/bpta-power-consumption-experience.md +119 -0
- package/data/docs/bpta-power-consumption-runtime-analysis.md +15 -0
- package/data/docs/bpta-power_overview.md +26 -0
- package/data/docs/bpta-pptimized-component-drawing.md +27 -0
- package/data/docs/bpta-pre-connect.md +133 -0
- package/data/docs/bpta-preloading-resources.md +21 -0
- package/data/docs/bpta-program-framework.md +15 -0
- package/data/docs/bpta-properly-use-foreground-resources.md +22 -0
- package/data/docs/bpta-purax-guide.md +215 -0
- package/data/docs/bpta-quality-overview.md +79 -0
- package/data/docs/bpta-reader-page-flip.md +890 -0
- package/data/docs/bpta-reasonable-audio-playback-use.md +42 -0
- package/data/docs/bpta-reasonable-audio-use.md +163 -0
- package/data/docs/bpta-reasonable-bluetooth-use.md +52 -0
- package/data/docs/bpta-reasonable-gps-use.md +59 -0
- package/data/docs/bpta-reasonable-network-use.md +105 -0
- package/data/docs/bpta-reasonable-position-navigation-use.md +47 -0
- package/data/docs/bpta-reasonable-request-use.md +77 -0
- package/data/docs/bpta-reasonable-sensor-use.md +53 -0
- package/data/docs/bpta-reasonable-system-use.md +67 -0
- package/data/docs/bpta-recommended-use-of-device-id.md +79 -0
- package/data/docs/bpta-reduce-layout-nodes.md +30 -0
- package/data/docs/bpta-reduce-time-consuming.md +36 -0
- package/data/docs/bpta-redundancy-refresh-guide.md +409 -0
- package/data/docs/bpta-render-web-using-same-layer-render.md +601 -0
- package/data/docs/bpta-resource-and-storage-optimization.md +14 -0
- package/data/docs/bpta-retrieve-process-memory-info.md +49 -0
- package/data/docs/bpta-rich-text-display.md +475 -0
- package/data/docs/bpta-rich-text-editor.md +426 -0
- package/data/docs/bpta-risk-control-engine.md +146 -0
- package/data/docs/bpta-scenario-performance-optimization.md +17 -0
- package/data/docs/bpta-scenario-power-optimization.md +12 -0
- package/data/docs/bpta-scenario-stability-address-sanitizer.md +210 -0
- package/data/docs/bpta-scenario-stability-app-freeze.md +615 -0
- package/data/docs/bpta-scenario-stability-cppcrash.md +516 -0
- package/data/docs/bpta-scenario-stability-exception-exit.md +12 -0
- package/data/docs/bpta-scenario-stability-jscrash.md +922 -0
- package/data/docs/bpta-scenario-stability-leak.md +276 -0
- package/data/docs/bpta-scenario-stability.md +14 -0
- package/data/docs/bpta-screen-flicker-solution.md +480 -0
- package/data/docs/bpta-shared-bicycle.md +509 -0
- package/data/docs/bpta-short-video-base-adaptivevideo.md +403 -0
- package/data/docs/bpta-smart-reach.md +306 -0
- package/data/docs/bpta-smartwatch.md +755 -0
- package/data/docs/bpta-smartwatchnavigation.md +384 -0
- package/data/docs/bpta-smooth-application-design.md +225 -0
- package/data/docs/bpta-smooth-switching.md +294 -0
- package/data/docs/bpta-social-communications.md +11 -0
- package/data/docs/bpta-social-share.md +637 -0
- package/data/docs/bpta-solutions-to-special-issues.md +12 -0
- package/data/docs/bpta-sound-quality-switching.md +422 -0
- package/data/docs/bpta-spatiality-immersive.md +531 -0
- package/data/docs/bpta-special-text-recognition.md +137 -0
- package/data/docs/bpta-stability-address-illegal-way.md +190 -0
- package/data/docs/bpta-stability-address-sanitizer-catagory.md +212 -0
- package/data/docs/bpta-stability-address-sanitizer-faq.md +32 -0
- package/data/docs/bpta-stability-address-sanitizer-opt.md +170 -0
- package/data/docs/bpta-stability-address-sanitizer-overview.md +23 -0
- package/data/docs/bpta-stability-address-sanitizer-principle.md +179 -0
- package/data/docs/bpta-stability-analysis.md +17 -0
- package/data/docs/bpta-stability-app-analyzer.md +11 -0
- package/data/docs/bpta-stability-app-crash-cpp-way.md +200 -0
- package/data/docs/bpta-stability-app-crash-js-way.md +148 -0
- package/data/docs/bpta-stability-app-crash.md +13 -0
- package/data/docs/bpta-stability-app-freeze-ark-runtime.md +339 -0
- package/data/docs/bpta-stability-app-freeze-opt.md +80 -0
- package/data/docs/bpta-stability-app-freeze-way.md +410 -0
- package/data/docs/bpta-stability-app-freeze.md +12 -0
- package/data/docs/bpta-stability-app-killed-way.md +49 -0
- package/data/docs/bpta-stability-ark-detection.md +12 -0
- package/data/docs/bpta-stability-ark-exception-detection.md +38 -0
- package/data/docs/bpta-stability-ark-runtime-detection.md +134 -0
- package/data/docs/bpta-stability-asan-detection.md +450 -0
- package/data/docs/bpta-stability-coding-standard-api.md +2054 -0
- package/data/docs/bpta-stability-coding-standard-cpp.md +91 -0
- package/data/docs/bpta-stability-coding-standard-libuv.md +772 -0
- package/data/docs/bpta-stability-coding-standard-ndk-arkts.md +189 -0
- package/data/docs/bpta-stability-coding-standard-node.md +478 -0
- package/data/docs/bpta-stability-coding-standard.md +16 -0
- package/data/docs/bpta-stability-cpp-crash-opt.md +346 -0
- package/data/docs/bpta-stability-detection.md +14 -0
- package/data/docs/bpta-stability-deveco-testing.md +73 -0
- package/data/docs/bpta-stability-develop-detection.md +17 -0
- package/data/docs/bpta-stability-exception-exit-opt.md +12 -0
- package/data/docs/bpta-stability-fault-log.md +14 -0
- package/data/docs/bpta-stability-fault-type.md +31 -0
- package/data/docs/bpta-stability-file-handle-detection.md +96 -0
- package/data/docs/bpta-stability-gwpasan-detection.md +588 -0
- package/data/docs/bpta-stability-hwasan-detection.md +360 -0
- package/data/docs/bpta-stability-ide-static-detection.md +343 -0
- package/data/docs/bpta-stability-js-crash-opt.md +21 -0
- package/data/docs/bpta-stability-js-memleak-detection.md +214 -0
- package/data/docs/bpta-stability-leak-detection.md +15 -0
- package/data/docs/bpta-stability-leak-opt.md +251 -0
- package/data/docs/bpta-stability-leak-way.md +459 -0
- package/data/docs/bpta-stability-log-specs.md +31 -0
- package/data/docs/bpta-stability-log-standard-hilog.md +191 -0
- package/data/docs/bpta-stability-log-standard.md +11 -0
- package/data/docs/bpta-stability-memleak-detection-overview.md +109 -0
- package/data/docs/bpta-stability-native-memleak-detection.md +204 -0
- package/data/docs/bpta-stability-operate-apm.md +113 -0
- package/data/docs/bpta-stability-operate-app-event.md +320 -0
- package/data/docs/bpta-stability-operate-event.md +11 -0
- package/data/docs/bpta-stability-operate.md +15 -0
- package/data/docs/bpta-stability-opt.md +18 -0
- package/data/docs/bpta-stability-overview.md +17 -0
- package/data/docs/bpta-stability-ram-detection.md +17 -0
- package/data/docs/bpta-stability-runtime-address-sanitizer-detection.md +21 -0
- package/data/docs/bpta-stability-runtime-appkilled-detection.md +44 -0
- package/data/docs/bpta-stability-runtime-crash-detection.md +14 -0
- package/data/docs/bpta-stability-runtime-detection.md +14 -0
- package/data/docs/bpta-stability-runtime-exception-exit-detection.md +12 -0
- package/data/docs/bpta-stability-runtime-freeze-detection.md +21 -0
- package/data/docs/bpta-stability-runtime-leak-detection.md +31 -0
- package/data/docs/bpta-stability-testing.md +11 -0
- package/data/docs/bpta-stability-thread-detection.md +11 -0
- package/data/docs/bpta-stability-thread-leak-detection.md +35 -0
- package/data/docs/bpta-stability-tsan-detection.md +477 -0
- package/data/docs/bpta-stability-ubsan-detection.md +350 -0
- package/data/docs/bpta-startup-response-optimization.md +12 -0
- package/data/docs/bpta-state-refresh.md +48 -0
- package/data/docs/bpta-static-scenarios.md +63 -0
- package/data/docs/bpta-status-management.md +872 -0
- package/data/docs/bpta-surface-encoder.md +427 -0
- package/data/docs/bpta-swiper_high_performance_development_guide.md +357 -0
- package/data/docs/bpta-tablet-pc.md +11 -0
- package/data/docs/bpta-taskpool_usage_specifications_and_faqs.md +625 -0
- package/data/docs/bpta-text-expand-collapse.md +274 -0
- package/data/docs/bpta-texture-compression-improve-performance.md +336 -0
- package/data/docs/bpta-thread-priority-setting.md +233 -0
- package/data/docs/bpta-threads-serialization-timeout-analysis.md +169 -0
- package/data/docs/bpta-time-optimization-of-the-main-thread.md +1239 -0
- package/data/docs/bpta-travel-navigation.md +11 -0
- package/data/docs/bpta-tv.md +11 -0
- package/data/docs/bpta-ui-component-encapsulation.md +585 -0
- package/data/docs/bpta-ui-component-performance-optimization.md +597 -0
- package/data/docs/bpta-ui-dynamic-operations.md +618 -0
- package/data/docs/bpta-ui-skip-analysis.md +191 -0
- package/data/docs/bpta-unified-drag-and-drop.md +1189 -0
- package/data/docs/bpta-use-of-background-hardware-resources.md +16 -0
- package/data/docs/bpta-use-of-background-software-resources.md +14 -0
- package/data/docs/bpta-use-of-background-tasks.md +23 -0
- package/data/docs/bpta-utilize-hwc-efficiently.md +461 -0
- package/data/docs/bpta-vdeocast.md +558 -0
- package/data/docs/bpta-video-adaptation-based-web.md +462 -0
- package/data/docs/bpta-video-barrage.md +68 -0
- package/data/docs/bpta-video-codec.md +42 -0
- package/data/docs/bpta-video-component-long-video.md +659 -0
- package/data/docs/bpta-video-component-short-video.md +337 -0
- package/data/docs/bpta-video-layer.md +32 -0
- package/data/docs/bpta-video-practices.md +12 -0
- package/data/docs/bpta-video-render.md +1225 -0
- package/data/docs/bpta-video-rom.md +37 -0
- package/data/docs/bpta-video-thumbnail.md +179 -0
- package/data/docs/bpta-video-wifi.md +40 -0
- package/data/docs/bpta-vsync-power-optimization.md +116 -0
- package/data/docs/bpta-waterflow-based-on-scrollcomponents.md +989 -0
- package/data/docs/bpta-waterflow-operations.md +991 -0
- package/data/docs/bpta-waterflow-performance-optimization.md +191 -0
- package/data/docs/bpta-wavewheel-for-image-editor.md +421 -0
- package/data/docs/bpta-wear.md +12 -0
- package/data/docs/bpta-web-adaptation.md +451 -0
- package/data/docs/bpta-web-app-jump-and-pull-up.md +310 -0
- package/data/docs/bpta-web-click-response-delay-analysis.md +164 -0
- package/data/docs/bpta-web-completion-delay-analysis.md +209 -0
- package/data/docs/bpta-web-develop-optimization.md +2596 -0
- package/data/docs/bpta-web-development.md +15 -0
- package/data/docs/bpta-web-frame-rate-performance-analysis.md +252 -0
- package/data/docs/bpta-web-interceptor.md +724 -0
- package/data/docs/bpta-web-performance-optimization.md +11 -0
- package/data/docs/bpta-window-and-screen-management.md +12 -0
- package/data/docs/bpta-zhenlv.md +559 -0
- package/data/docs/changelog.md +1410 -0
- package/data/docs/low-power-consumption-suggestions.md +246 -0
- package/data/docs/multi-business-office.md +275 -0
- package/data/docs/multi-communication-app.md +240 -0
- package/data/docs/multi-community-app.md +257 -0
- package/data/docs/multi-convenient-life.md +501 -0
- package/data/docs/multi-financial-app.md +288 -0
- package/data/docs/multi-news-read.md +286 -0
- package/data/docs/multi-picture-app.md +219 -0
- package/data/docs/multi-shopping-price-comparison.md +254 -0
- package/data/docs/multi-short-video-app.md +315 -0
- package/data/docs/multi-ticket-class.md +458 -0
- package/data/docs/multi-travel-accommodation.md +361 -0
- package/data/docs/multi-travel-navigation.md +449 -0
- package/data/docs/multi-video-app.md +492 -0
- package/data/index.md +2886 -0
- package/dist/data.js +180 -0
- package/dist/index.js +203 -0
- package/dist/search.js +102 -0
- package/package.json +57 -0
- package/scripts/trim-code-extra.mjs +78 -0
- package/scripts/trim-code.mjs +106 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
# 水印添加
|
|
2
|
+
|
|
3
|
+
> 来源: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-add-watermark
|
|
4
|
+
> 文档标识(fileName): bpta-add-watermark
|
|
5
|
+
> 目录(catalogName): best-practices
|
|
6
|
+
> 语言: cn
|
|
7
|
+
> 更新时间: 2026-06-23 03:36:07
|
|
8
|
+
> 导航地址: /hmos/hmos-dp1
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
#### 概述
|
|
12
|
+
|
|
13
|
+
在软件开发中,水印是一种在应用页面、图片或文档中嵌入的标记,它通常采用文字或图案的形式展现。水印通常有以下用途:
|
|
14
|
+
|
|
15
|
+
- 标识来源:可用于标识应用、各种文件的来源或作者,确保产权的归属。
|
|
16
|
+
- 版权保护:可携带版权保护信息,有效防止他人篡改、盗用、非法复制。
|
|
17
|
+
- 艺术效果:可作为一种艺术效果,为图片或应用增添独特的风格。
|
|
18
|
+
|
|
19
|
+
本文通过图文与代码结合的方式,对以下几种常见的水印添加场景进行讲解,旨在让开发者理解水印添加的基本原理以及掌握开发的流程与细节。
|
|
20
|
+
|
|
21
|
+
- [页面上添加水印](#section12388834480)
|
|
22
|
+
- [图片上添加水印](#section987311343125)
|
|
23
|
+
- [PDF文档添加水印](#section7418171112138)
|
|
24
|
+
|
|
25
|
+
#### 页面上添加水印
|
|
26
|
+
|
|
27
|
+
## 场景描述
|
|
28
|
+
|
|
29
|
+
某个页面背景上添加水印文字,实现效果图如下。
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
## 实现原理
|
|
34
|
+
|
|
35
|
+
**关键技术**
|
|
36
|
+
|
|
37
|
+
[Canvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas)提供画布组件,用于自定义绘制图形。使用[CanvasRenderingContext2D](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-canvasrenderingcontext2d)对象在[Canvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas)组件上进行绘制,其中[fillText()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-canvasrenderingcontext2d#filltext)方法用于绘制文本,[drawImage()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-canvasrenderingcontext2d#drawimage)方法用于图像绘制。
|
|
38
|
+
|
|
39
|
+
**开发流程**
|
|
40
|
+
|
|
41
|
+
1. 创建[Canvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas)画布,在画布上绘制水印。
|
|
42
|
+
2. 使用[Stack](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-stack)组件或[浮层overlay](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-overlay#overlay)属性,将画布与UI页面组件融合显示。
|
|
43
|
+
|
|
44
|
+
## 开发步骤
|
|
45
|
+
|
|
46
|
+
1. 封装水印组件
|
|
47
|
+
1. 创建Canvas组件,监听[Canvas.onReady](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas#事件)事件,该事件回调在Canvas组件初始化完成时或大小变化时执行,在回调中进行水印绘制draw()方法的执行。并通过设置Canvas组件的[hitTestBehavior](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-hit-test-behavior#hittestbehavior)属性,使水印组件不影响其他组件的触摸测试,让页面能正常交互。
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
@Component
|
|
51
|
+
export struct Watermark {
|
|
52
|
+
private settings: RenderingContextSettings = new RenderingContextSettings(true);
|
|
53
|
+
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
|
|
54
|
+
// ...
|
|
55
|
+
build() {
|
|
56
|
+
Canvas(this.context)
|
|
57
|
+
.width('100%')
|
|
58
|
+
.height('100%')
|
|
59
|
+
.hitTestBehavior(HitTestMode.Transparent)
|
|
60
|
+
.onReady(() => this.draw())
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
2. 实现绘制水印draw()方法。绘制的起点默认为坐标轴的原点(画布的左上角),通过坐标轴的平移及旋转,实现在画布的不同位置、不同角度绘制水印。如果水印有一定旋转角度,想保证第一个水印能完整显示,需要对绘制的起点做平移,平移距离通过旋转角度及水印宽高计算。
|
|
65
|
+
- 旋转角度大于0,由下图可知,水印沿x轴方向平移距离positionX = tan(θ) * 水印高度,即绘制起点为(positionX, 0)。
|
|
66
|
+
|
|
67
|
+

|
|
68
|
+
- 旋转角度小于0,由下图可知,水印沿y轴方向平移距离positionY = tan(θ) * 水印宽度,即绘制起点为(0, positionY)。
|
|
69
|
+
|
|
70
|
+

|
|
71
|
+
|
|
72
|
+
最终通过[CanvasRenderingContext2D.fillText()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-canvasrenderingcontext2d#filltext)方法进行水印文字的绘制。
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
@Prop watermarkWidth: number = 120;
|
|
76
|
+
@Prop watermarkHeight: number = 120;
|
|
77
|
+
@Prop watermarkText: string = this.getWatermarkText();
|
|
78
|
+
@Prop rotationAngle: number = -30;
|
|
79
|
+
@Prop fillColor: string | number | CanvasGradient | CanvasPattern = '#10000000';
|
|
80
|
+
@Prop font: string = '16vp';
|
|
81
|
+
|
|
82
|
+
draw() {
|
|
83
|
+
this.context.fillStyle = this.fillColor;
|
|
84
|
+
this.context.font = this.font;
|
|
85
|
+
const colCount = Math.ceil(this.context.width / this.watermarkWidth);
|
|
86
|
+
const rowCount = Math.ceil(this.context.height / this.watermarkHeight);
|
|
87
|
+
for (let col = 0; col <= colCount; col++) {
|
|
88
|
+
let row = 0;
|
|
89
|
+
for (; row <= rowCount; row++) {
|
|
90
|
+
const angle = this.rotationAngle * Math.PI / 180;
|
|
91
|
+
this.context.rotate(angle);
|
|
92
|
+
const positionX = this.rotationAngle > 0 ? this.watermarkHeight * Math.tan(angle) : 0;
|
|
93
|
+
const positionY = this.rotationAngle > 0 ? 0 : this.watermarkWidth * Math.tan(-angle);
|
|
94
|
+
this.context.fillText(this.watermarkText, positionX, positionY);
|
|
95
|
+
this.context.rotate(-angle);
|
|
96
|
+
this.context.translate(0, this.watermarkHeight);
|
|
97
|
+
}
|
|
98
|
+
this.context.translate(0, -this.watermarkHeight * row);
|
|
99
|
+
this.context.translate(this.watermarkWidth, 0);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
2. 将水印组件与UI页面组件融合显示。
|
|
104
|
+
|
|
105
|
+
方式一:使用Stack将水印组件叠加在UI组件上层。
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
Stack({ alignContent: Alignment.Center }) {
|
|
109
|
+
Column() {
|
|
110
|
+
Image($r('app.media.empty'))
|
|
111
|
+
.width(110)
|
|
112
|
+
.height(88)
|
|
113
|
+
// ...
|
|
114
|
+
}
|
|
115
|
+
Watermark({ rotationAngle: 20 })
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
方式二:设置UI组件的overlay属性,使水印组件作为UI组件的浮层显示。注意watermarkBuilder中嵌套了一层父元素Column,所以需要同时设置Column的[hitTestBehavior](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-hit-test-behavior#hittestbehavior)属性,使浮层下方页面能正常交互。
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
@Builder
|
|
123
|
+
watermarkBuilder() {
|
|
124
|
+
Column() {
|
|
125
|
+
Watermark()
|
|
126
|
+
}
|
|
127
|
+
.hitTestBehavior(HitTestMode.Transparent)
|
|
128
|
+
}
|
|
129
|
+
build() {
|
|
130
|
+
// ...
|
|
131
|
+
Column() {
|
|
132
|
+
Image($r('app.media.empty'))
|
|
133
|
+
.width(110)
|
|
134
|
+
.height(88)
|
|
135
|
+
// ...
|
|
136
|
+
}
|
|
137
|
+
.justifyContent(FlexAlign.Center)
|
|
138
|
+
.alignItems(HorizontalAlign.Center)
|
|
139
|
+
.layoutWeight(1)
|
|
140
|
+
.overlay(this.watermarkBuilder())
|
|
141
|
+
// ...
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+

|
|
146
|
+
|
|
147
|
+
如果需要多个页面或应用全局添加水印,可将上述方式二中的watermarkBuilder封装到一个单独的文件,export出一个全局的watermarkBuilder。在需要添加水印页面的根节点上添加.overlay绑定watermarkBuilder即可。
|
|
148
|
+
|
|
149
|
+
#### 图片上添加水印
|
|
150
|
+
|
|
151
|
+
## 场景描述
|
|
152
|
+
|
|
153
|
+
保存的图片、拍照生成的图片等场景,需要添加水印。实现效果图如下。
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
## 实现原理
|
|
158
|
+
|
|
159
|
+
**关键技术**
|
|
160
|
+
|
|
161
|
+
[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)提供离屏画布,与[Canvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-canvas-canvas)使用场景区别在于是否需要将画布渲染在屏幕上。使用[OffscreenCanvasRenderingContext2D](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d)在[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)上进行离屏绘制,其中[fillText()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#filltext)方法用于绘制文本,[drawImage()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#drawimage)方法用于图像绘制。
|
|
162
|
+
|
|
163
|
+
**开发流程**
|
|
164
|
+
|
|
165
|
+
1. 解析图片得到pixelMap数据。
|
|
166
|
+
2. 创建与图片宽高一致的[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)离屏画布。
|
|
167
|
+
3. 将图片和水印依次绘制到离屏画布上。
|
|
168
|
+
4. 获取离屏画布的pixelMap数据。
|
|
169
|
+
5. 将pixelMap数据写入文件中。
|
|
170
|
+
|
|
171
|
+
## 开发步骤
|
|
172
|
+
|
|
173
|
+
1. 解析图片得到pixelMap数据。
|
|
174
|
+
1. 使用[resourceManager.getMediaContent()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-resource-manager#getmediacontent9-1)方法获取图片内容,得到ArrayBuffer数据。使用[image.createImageSource(buf: ArrayBuffer)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-f#imagecreateimagesource9-2)方法创建图片源实例。
|
|
175
|
+
|
|
176
|
+

|
|
177
|
+
|
|
178
|
+
ImagePixelMap为自定义类型:{ pixelMap: image.PixelMap, width: number, height: number }。
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
async getImagePixelMap(resource: Resource): Promise<ImagePixelMap | undefined> {
|
|
182
|
+
let result: ImagePixelMap | undefined = undefined;
|
|
183
|
+
try {
|
|
184
|
+
const data: Uint8Array =
|
|
185
|
+
await this.getUIContext().getHostContext()?.resourceManager.getMediaContent(resource.id) as Uint8Array;
|
|
186
|
+
const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteLength + data.byteOffset);
|
|
187
|
+
const imageSource: image.ImageSource = image.createImageSource(arrayBuffer);
|
|
188
|
+
result = await imageSource2PixelMap(imageSource);
|
|
189
|
+
} catch (e) {
|
|
190
|
+
let err = e as BusinessError;
|
|
191
|
+
hilog.error(0x0000, TAG, `failed code=${err.code}, message=${err.message}`);
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
2. 使用[ImageSource.getImageInfo()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-imagesource#getimageinfo-2)方法获取图片宽、高信息,使用[ImageSource.createPixelMap()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-imagesource#createpixelmap7)方法创建PixelMap对象。
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
export async function imageSource2PixelMap(imageSource: image.ImageSource): Promise<ImagePixelMap> {
|
|
200
|
+
const imageInfo: image.ImageInfo = await imageSource.getImageInfo();
|
|
201
|
+
const height = imageInfo.size.height;
|
|
202
|
+
const width = imageInfo.size.width;
|
|
203
|
+
const options: image.DecodingOptions = {
|
|
204
|
+
editable: true,
|
|
205
|
+
desiredSize: { height, width }
|
|
206
|
+
};
|
|
207
|
+
const pixelMap: PixelMap = await imageSource.createPixelMap(options);
|
|
208
|
+
const result: ImagePixelMap = { pixelMap, width, height };
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
2. 通过[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)离屏画布绘制图片及水印,得到融合水印后的pixelMap数据。
|
|
213
|
+
1. 创建与图片宽高一致的[OffscreenCanvas](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-components-offscreencanvas)离屏画布,这里注意单位保持一致。
|
|
214
|
+
2. 使用[OffscreenCanvasRenderingContext2D.drawImage()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#drawimage)将图片绘制到离屏画布上。
|
|
215
|
+
3. 使用[OffscreenCanvasRenderingContext2D.fillText()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#filltext)将水印绘制在离屏画布的指定位置。
|
|
216
|
+
4. 使用[OffscreenCanvasRenderingContext2D.getPixelMap()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-offscreencanvasrenderingcontext2d#getpixelmap)以当前离屏画布指定区域内的像素创建PixelMap对象。
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
export function addWatermark(
|
|
220
|
+
imagePixelMap: ImagePixelMap,
|
|
221
|
+
text: string = 'watermark',
|
|
222
|
+
drawWatermark?: (OffscreenContext: OffscreenCanvasRenderingContext2D) => void
|
|
223
|
+
): image.PixelMap {
|
|
224
|
+
const height = uiContext?.px2vp(imagePixelMap.height) as number;
|
|
225
|
+
const width = uiContext?.px2vp(imagePixelMap.width) as number;
|
|
226
|
+
const offScreenCanvas = new OffscreenCanvas(width, height);
|
|
227
|
+
const offScreenContext = offScreenCanvas.getContext('2d');
|
|
228
|
+
offScreenContext.drawImage(imagePixelMap.pixelMap, 0, 0, width, height);
|
|
229
|
+
if (drawWatermark) {
|
|
230
|
+
drawWatermark(offScreenContext);
|
|
231
|
+
} else {
|
|
232
|
+
let displayWidth: number = 0;
|
|
233
|
+
try {
|
|
234
|
+
displayWidth = display.getDefaultDisplaySync().width;
|
|
235
|
+
} catch (e) {
|
|
236
|
+
let err = e as BusinessError;
|
|
237
|
+
hilog.error(0x0000, TAG, `failed code=${err.code}, message=${err.message}`);
|
|
238
|
+
}
|
|
239
|
+
const vpWidth = uiContext?.px2vp(displayWidth) ?? displayWidth;
|
|
240
|
+
const imageScale = width / vpWidth;
|
|
241
|
+
offScreenContext.textAlign = 'right';
|
|
242
|
+
offScreenContext.fillStyle = '#A2FFFFFF';
|
|
243
|
+
offScreenContext.font = 12 * imageScale + 'vp';
|
|
244
|
+
const padding = 5 * imageScale;
|
|
245
|
+
offScreenContext.fillText(text, width - padding, height - padding);
|
|
246
|
+
}
|
|
247
|
+
return offScreenContext.getPixelMap(0, 0, width, height);
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
3. 将添加水印后得到的pixelMap数据写入文件中。
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
export async function saveToFile(pixelMap: image.PixelMap, context: Context): Promise<void> {
|
|
254
|
+
try {
|
|
255
|
+
const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
|
|
256
|
+
const filePath = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png');
|
|
257
|
+
const imagePacker = image.createImagePacker();
|
|
258
|
+
const imageBuffer = await imagePacker.packToData(pixelMap, {
|
|
259
|
+
format: 'image/png',
|
|
260
|
+
quality: 100
|
|
261
|
+
});
|
|
262
|
+
const mode = fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE;
|
|
263
|
+
fd = (await fileIo.open(filePath, mode)).fd;
|
|
264
|
+
await fileIo.truncate(fd);
|
|
265
|
+
await fileIo.write(fd, imageBuffer);
|
|
266
|
+
} catch (err) {
|
|
267
|
+
hilog.error(0x0000, TAG, 'saveToFile error:', JSON.stringify(err) ?? '');
|
|
268
|
+
} finally {
|
|
269
|
+
try {
|
|
270
|
+
if (fd) {
|
|
271
|
+
fileIo.close(fd);
|
|
272
|
+
}
|
|
273
|
+
} catch (e) {
|
|
274
|
+
let err = e as BusinessError;
|
|
275
|
+
hilog.error(0x0000, TAG, `close failed code=${err.code}, message=${err.message}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
#### PDF文档添加水印
|
|
282
|
+
|
|
283
|
+
## 场景描述
|
|
284
|
+
|
|
285
|
+
在PDF预览页面点击添加水印按钮,生成带水印的PDF文档,并显示在预览页面中。
|
|
286
|
+
|
|
287
|
+

|
|
288
|
+
|
|
289
|
+
## 实现原理
|
|
290
|
+
|
|
291
|
+
**关键技术**
|
|
292
|
+
|
|
293
|
+
[pdfService](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice)模块为应用提供统一管理PDF页面的页眉页脚、水印、背景、批注、书签的能力。[TextWatermarkInfo](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#textwatermarkinfo)类和[ImageWatermarkInfo](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#imagewatermarkinfo)分别提供创建文本水印和图片水印的能力。[PdfDocument](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#pdfdocument)类提供与文档相关能力,其中[addWatermark()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#addwatermark)方法用于添加水印。
|
|
294
|
+
|
|
295
|
+
**开发流程**
|
|
296
|
+
|
|
297
|
+
1. 将应用侧PDF文件写入沙箱中。
|
|
298
|
+
2. 使用[pdfService](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice)模块相关API加载指定沙箱路径的PDF并添加水印。
|
|
299
|
+
|
|
300
|
+
## 开发步骤
|
|
301
|
+
|
|
302
|
+
1. 使用[getRawFileContentSync()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-resource-manager#getrawfilecontentsync10)方法获取resource/rawfile目录下的PDF文件内容,使用[writeSync()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs#writesync10)方法写入沙箱中。
|
|
303
|
+
|
|
304
|
+
```
|
|
305
|
+
savePdfToSandbox(): string {
|
|
306
|
+
const filePath = this.getPdfSandboxPath();
|
|
307
|
+
try {
|
|
308
|
+
fileIo.accessSync(filePath);
|
|
309
|
+
const content: Uint8Array = this.getUIContext().getHostContext()?.resourceManager.getRawFileContentSync('watermark.pdf') as Uint8Array;
|
|
310
|
+
const file = fileIo.openSync(filePath, fileIo.OpenMode.WRITE_ONLY | fileIo.OpenMode.CREATE | fileIo.OpenMode.TRUNC);
|
|
311
|
+
fileIo.writeSync(file.fd, content.buffer);
|
|
312
|
+
fileIo.closeSync(file.fd);
|
|
313
|
+
} catch (e) {
|
|
314
|
+
let err = e as BusinessError;
|
|
315
|
+
hilog.error(0x0000, TAG, `savePdfToSandbox failed code=${err.code}, message=${err.message}`);
|
|
316
|
+
}
|
|
317
|
+
return filePath;
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
2. 使用[PdfController](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfviewmanage#pdfcontroller)控制器中的[loadDocument()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#loaddocument)方法通过沙箱路径加载文件,显示到PDF预览组件[PdfView](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfview-component)中。
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
private controller: pdfViewManager.PdfController = new pdfViewManager.PdfController();
|
|
324
|
+
// ...
|
|
325
|
+
aboutToAppear(): void {
|
|
326
|
+
const filePath = this.savePdfToSandbox();
|
|
327
|
+
this.controller.loadDocument(filePath);
|
|
328
|
+
}
|
|
329
|
+
// ...
|
|
330
|
+
build() {
|
|
331
|
+
// ...
|
|
332
|
+
PdfView({
|
|
333
|
+
controller: this.controller,
|
|
334
|
+
pageFit: pdfService.PageFit.FIT_WIDTH
|
|
335
|
+
})
|
|
336
|
+
// ...
|
|
337
|
+
```
|
|
338
|
+
3. 通过文本水印类TextWatermarkInfo创建水印对象,设置水印内容、字体、颜色、位置等相关属性;图片水印对象通过ImageWatermarkInfo创建。
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
getWatermarkInfo() {
|
|
342
|
+
const watermarkInfo: pdfService.TextWatermarkInfo = new pdfService.TextWatermarkInfo();
|
|
343
|
+
watermarkInfo.watermarkType = pdfService.WatermarkType.WATERMARK_TEXT;
|
|
344
|
+
watermarkInfo.content = 'This is Watermark';
|
|
345
|
+
watermarkInfo.textSize = 32;
|
|
346
|
+
watermarkInfo.textColor = 200;
|
|
347
|
+
watermarkInfo.rotation = 45;
|
|
348
|
+
watermarkInfo.opacity = 0.3;
|
|
349
|
+
return watermarkInfo;
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
4. 通过PDF文档类PdfDocument创建文档对象,使用文档对象的loadDocument()方法加载文档,addWatermark()方法添加水印、[saveDocument()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#savedocument)方法将添加水印后的文档保存到沙箱中。
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
addWatermark() {
|
|
356
|
+
const filePath = this.getPdfSandboxPath();
|
|
357
|
+
let pdfDocument: pdfService.PdfDocument = new pdfService.PdfDocument();
|
|
358
|
+
pdfDocument.loadDocument(filePath);
|
|
359
|
+
pdfDocument.addWatermark(this.getWatermarkInfo(), 0, pdfDocument.getPageCount(), true, true);
|
|
360
|
+
const watermarkFilePath = this.getAddedWatermarkPdfSandboxPath();
|
|
361
|
+
pdfDocument.saveDocument(watermarkFilePath);
|
|
362
|
+
this.showInPdfView(watermarkFilePath);
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
5. 将沙箱中添加水印后的文档加载到PDF预览器中。
|
|
366
|
+
|
|
367
|
+
```
|
|
368
|
+
async showInPdfView(filePath: string) {
|
|
369
|
+
this.hasWatermark = true;
|
|
370
|
+
// release before reload avoid crash.
|
|
371
|
+
this.controller.releaseDocument();
|
|
372
|
+
await this.controller.loadDocument(filePath);
|
|
373
|
+
this.controller.setPageFit(pdfService.PageFit.FIT_WIDTH);
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
#### 示例代码
|
|
378
|
+
|
|
379
|
+
- [实现添加水印功能](https://gitcode.com/harmonyos_samples/watermark)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 广告跳转
|
|
2
|
+
|
|
3
|
+
> 来源: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-ads-jump
|
|
4
|
+
> 文档标识(fileName): bpta-ads-jump
|
|
5
|
+
> 目录(catalogName): best-practices
|
|
6
|
+
> 语言: cn
|
|
7
|
+
> 更新时间: 2026-06-23 03:35:01
|
|
8
|
+
> 导航地址: /hmos/hmos-dp1
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
#### 概述
|
|
12
|
+
|
|
13
|
+
在移动应用或Web开发中,广告跳转是一种常见的商业模式,通过引导用户点击广告并跳转到目标页面(例如应用下载、商品详情、活动页等)来实现流量变现或推广。
|
|
14
|
+
|
|
15
|
+
典型场景:例如视频应用作为广告载体,用户在开屏广告中点击商品广告后,系统自动跳转到商城应用的商品详情页。这样既提升了广告转化率,也优化了用户体验。
|
|
16
|
+
|
|
17
|
+
[](https://contentcenter-videovali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_300_3/4d/v3/Ml6UClqIS66HyhB5IFomkg/zh-cn_media_0000002284717440.mp4?HW-CC-KV=V1&HW-CC-Date=20260623T075538Z&HW-CC-Expire=86400&HW-CC-Sign=750992E248E25DE54C88A3E2905E82C6F499A45FDBA75E38459FEF70C132FFFE)
|
|
18
|
+
|
|
19
|
+
本文以广告目标方(如商城应用)的开发为主,介绍商城应用如何通过App Linking技术,支持视频应用等外部广告载体高效拉起商城应用商品页,并完善未安装、延迟跳转等各种链路,从而实现完整的广告变现闭环。
|
|
20
|
+
|
|
21
|
+
#### 实现原理
|
|
22
|
+
|
|
23
|
+
广告跳转链路涉及两个应用,具体如下:
|
|
24
|
+
|
|
25
|
+
- 广告载体方(如视频应用):承担广告展示与落地页跳转功能。
|
|
26
|
+
- 广告目标方(如商城应用):被外部应用拉起,承接点击流量至商品详情页。
|
|
27
|
+
|
|
28
|
+
广告跳转的流程图如下所示。
|
|
29
|
+
|
|
30
|
+

|
|
31
|
+
|
|
32
|
+
跳转过程基于[App Linking](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-linking-startup)能力,分为几种情况:
|
|
33
|
+
|
|
34
|
+
1. 商城应用已安装
|
|
35
|
+
|
|
36
|
+
用户在视频应用广告页点击商品,系统通过App Linking直接拉起商城应用并跳转到指定商品详情页。
|
|
37
|
+
2. 商城应用未安装,配置直达应用市场
|
|
38
|
+
|
|
39
|
+
点击广告后由系统自动跳转至商城应用在应用市场的详情页,用户下载安装后,首次打开即可通过延迟链接直接定位到对应商品页。
|
|
40
|
+
3. 商城应用未安装,未配置直达应用市场
|
|
41
|
+
|
|
42
|
+
点击广告后,系统拉起商城应用的Web页面(商品详情页),用户可直接浏览或通过页面引导下载安装商城应用。后续如完成安装,仍能保留原始跳转意图,实现直达商品页。
|
|
43
|
+
|
|
44
|
+
#### 开发步骤
|
|
45
|
+
|
|
46
|
+
1. [配置App Linking服务](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-social-share#section109826570198)。
|
|
47
|
+
- 在AGC(AppGallery Connect)后台为商城应用开通[App Linking](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-linking-startup)能力,正确配置商品详情页的深度链接与参数。
|
|
48
|
+
- 确认所有需要被广告载体(如视频应用)跳转的页面均能通过App Linking唯一链接定位。
|
|
49
|
+
2. 开发商品详情Web页面
|
|
50
|
+
- 实现商品详情的Web页面,保证当商城应用未安装时,点击跳转链接可以展示同样的商品信息。
|
|
51
|
+
- 在Web页面中,可以提供“打开商城应用”“下载商城应用”等引导按钮,增强用户转化率。
|
|
52
|
+
- 参考[Web页面开发与部署](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-social-share#section157709544229)完成部署与配置。
|
|
53
|
+
|
|
54
|
+

|
|
55
|
+
|
|
56
|
+
如果广告载体方(如视频应用)希望在自身应用内直接打开商城应用的商品详情Web页面,可以在调用[openLink()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-uiabilitycontext#openlink12)接口时,将参数appLinkingOnly设置为true。这样当无法拉起商城应用时,系统不会自动跳转到浏览器打开Web页面,而是通过失败回调返回结果。
|
|
57
|
+
|
|
58
|
+
广告载体方(如视频应用)可在回调中自行处理异常,例如手动跳转到商城应用的商品详情Web页面,实现更灵活的跳转控制。
|
|
59
|
+
3. 配置直达应用市场能力(可选)
|
|
60
|
+
- 若目标是让用户优先安装商城应用以获得完整体验,建议在App Linking配置中启用[直达应用市场](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/applinking-direct-to-ag)能力。
|
|
61
|
+
- 用户点击广告,如果商城应用未安装,将直接进入商城应用的应用市场页面,无须经过Web中转。
|
|
62
|
+
4. 实现延迟链接能力
|
|
63
|
+
- 配置并实现[延迟链接](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/applinking-deferredlink)(Deferred Link)功能。
|
|
64
|
+
- 用户在广告链路中下载安装商城应用后,首次打开应用可自动恢复跳转到指定商品页,保证广告流量完整转化。
|
|
65
|
+
5. 向广告载体方(如视频应用)提供标准App Linking跳转链接
|
|
66
|
+
|
|
67
|
+
将每一个商品的App Linking链接提供给广告载体(如视频应用),广告点击后调用openLink()接口进行跳转。
|