検索
ホームページウェブフロントエンドH5 チュートリアルHTML5 を使用して消しゴムにじみ効果を実現するためのチュートリアル_html5 チュートリアル スキル

このエフェクトは最近のプロジェクトで使用されたばかりで、モバイル デバイス上で画像をスクラッチして別の画像を表示するものに似ています。レンダリングは次のとおりです:
2015511163305472.png (974×840)

デモは右をクリックしてください: デモ
これはインターネット上で非常に一般的ですが、最初はオンラインでデモを見つけて、彼の方法を適用したかっただけです。顧客の要求により、Android 上で特にスムーズである必要はなく、少なくともプレイ可能である必要がありますが、オンラインで見つけたデモはラグがあり、まったくプレイできませんでした。なので、自分でも書いてみたかっただけで、この記事は研究過程を記録するためのものです。

このスクレイピング効果でまず思い浮かぶのは、キャンバスAPIでピクセルをクリアできるclearRectメソッドですが、結局のところclearRectメソッドは領域四角形をクリアします。消しゴムは丸いものに慣れている人が多いので、クリッピング エリアの強力な機能であるクリップ メソッドを紹介します。使用方法は非常に簡単です:

XML/HTML コードコンテンツをクリップボードにコピー
  1. ctx.save()
  2. ctx.beginPath()
  3. ctx.arc(x2,y2,a,0,2*Math.PI);
  4. ctx.clip()
  5. ctx.clearRect(0,0,canvas.width,canvas.height);
  6. ctx.restore();

上記のコードは円形領域の消去を実現しています。つまり、最初に円形パスを実装し、次にこのパスをクリッピング領域として使用し、その後ピクセルをクリアします。注意すべき点は、最初に描画環境を保存し、ピクセルをクリアした後に描画環境をリセットする必要があることです。リセットしないと、今後の描画はそのクリッピング領域に制限されます。

消去効果ができたので、次はマウスの移動による消去効果を記述します。モバイル版も同様であるため、マウスを使用して、mousedown を touchstart、mousemove に置き換えます。 touchmove で、mouseup で touchend を実行すると、座標点の取得が e.clientX から e.targetTouches[0].pageX に変更されます。

マウスの動きの消去を実装するために、最初はマウスが動いたときにトリガーされるmousemoveイベントでマウスが位置する円形の領域を消去することを考えました。 書き出してみると、マウスが非常に速く動くと、消去された領域が消去されることがわかりました。領域は一貫性を失い、次のような効果が表示されます。これは明らかに私たちが望んでいる消しゴム効果ではありません。
2015511163949198.jpg (1103×693)

すべての点が一貫性がないため、次に行うことはこれらの点を接続することです。描画機能を実装している場合は、lineTo を介して 2 つの点を直接接続してから描画できますが、消去効果はクリッピング領域です。閉じたパスが必要です。2 つの点を接続するだけでは、クリッピング エリアを形成できません。次に、計算メソッドを使用して、2 つの消去領域内の四角形の 4 つの終点座標を計算することを考えました。これは、下の図の赤い四角形です:
2015511164105508.png (343×129)

計算方法も非常に簡単です。2 つのクリッピング領域を結ぶ線の 2 つの端点の座標がわかり、必要な線の幅もわかるため、長方形の 4 つの端点の座標は次のようになります。見つけやすいので、以下のコードがあります:
XML/HTML コード内容をクリップボードにコピー

  1. var aasin = a*Math.sin(Math.atan((y2-y1)/(x2- x1)));
  2. var aacos = a*Math.cos(Math.atan((y2-y1)/(x2-x1)) )
  3. var x3 = x1 asin;
  4. var
  5. y3 = y1-acos; var
  6. x4
  7. = x1-asin; var y4
  8. =
  9. y1 acos; var x5 =
  10. x2
  11. asin; var y5 = y2
  12. -acos;
  13. var x6 = x2-asin;
  14. var
  15. y6 = y2 acos;

    x1,y1とx2,y2が2つの端点なので、4つの端点の座標が得られます。このように、クリッピング領域は円と四角形で構成され、コードは次のように構成されます:
    XML/HTML コードコンテンツをクリップボードにコピー

    1. var hastouch = "ontouchstart" in window?true:false,//モバイルデバイスの場合
    2. tapstart = hastouch?"touchstart":"mousedown",
    3. tapmove = hastouch?"touchmove":"mousemove",
    4. tapend = hastouch?"touchend":"mouseup";
    5. canvas.addEventListener(tapstart , function(e){
    6. e.preventDefault();
    7. x1 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft ;
    8. y1 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop ;
    9. // マウスの初回クリック時に円形領域を消去し、同時に最初の座標点を記録します
    10. ctx.save()
    11. ctx.beginPath()
    12. ctx.arc(x1,y1,a,0,2*Math.PI);
    13. ctx.clip()
    14. ctx.clearRect(0,0,canvas.width,canvas.height);
    15. ctx.restore();
    16. Canvas.addEventListener(tapmove, TapmoveHandler);
    17. Canvas.addEventListener(tapend, function(){
    18. Canvas.removeEventListener(tapmove, TapmoveHandler);
    19. });
    20. //このイベントはマウスが移動するとトリガーされます
    21. 関数 TapmoveHandler(e){
    22. e.preventDefault()
    23. x2 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft ;
    24. y2 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop ;
    25. //2 点間のクリッピング領域の 4 つの端点を取得します
    26. var aasin = a*Math.sin(Math.atan((y2-y1)/(x2-x1)) );
    27. var aacos = a*Math.cos(Math.atan((y2-y1)/(x2-x1)) )
    28. var x3 = x1 asin;
    29. var
    30. y3 = y1-acos; var
    31. x4
    32. = x1-asin; var y4
    33. =
    34. y1 acos; var x5 =
    35. x2
    36. asin; var y5 = y2
    37. -acos;
    38. var x6 = x2-asin;
    39. var
    40. y6 = y2 acos;
    41. // 線の連続性を確保するため、長方形の一端に円を描きます ctx.save() ctx.beginPath()
    42. ctx.arc(x2,y2,a,0,2*Math.PI);
    43. ctx.clip()
    44. ctx.clearRect(0,0,canvas.width,canvas.height);
    45. ctx.restore();
    46. // 長方形のクリッピング領域内のピクセルをクリアします
    47. ctx.save()
    48. ctx.beginPath()
    49. ctx.moveTo(x3,y3);
    50. ctx.lineTo(x5,y5);
    51. ctx.lineTo(x6,y6);
    52. ctx.lineTo(x4,y4);
    53. ctx.closePath();
    54. ctx.clip()
    55. ctx.clearRect(0,0,canvas.width,canvas.height);
    56. ctx.restore();
    57. //最後の座標を記録します
    58. x1 = x2;
    59. y1
    60. = y2; }
    61. })
    62. このようにして、マウスの消去効果が得られますが、もう 1 つ達成すべき点があります。これは、ほとんどの消去の効果で、一定のピクセル数を消去すると、すべての画像コンテンツが自動的に表示されます。効果を実現するには imgData を使用します。コードは次のとおりです: コードをコピー
    XML/HTML コード


    コンテンツをクリップボードにコピー

    var
    imgData
    1. = ctx.getImageData(0,0,canvas.width,canvas.身長); var dd
    2. =
    3. 0; for(var x=
    4. 0
    5. ;ximgData.width;x =1){ for(var y=
    6. 0
    7. ;yimgData.height;y =1){ var i = (y*imgData.width x)*4;
    8. if(imgData.data[i 3]
    9. > 0){
    10. dd dd
    11. }
    12. }
    13. if(dd/(imgData.width*imgData.height)
    14. 0.4){
    15. canvas.className = "noOp";
    16. }
    17. imgDataを取得し、imgData内のピクセルを走査し、imgDataのデータ配列内のrgbaのアルファを解析、つまり透明度を解析する ピクセルを消去すると透明度が0になります。現在のキャンバス内の透明度がゼロでないピクセルの数と、透明度がゼロでないピクセルの割合が 40% 未満の場合は、60% を超えることになります。現在のキャンバス上の領域を消去すると、画像が自動的に表示されます。

      ここで、mouseup イベントにピクセルをチェックするコードを入れていることに注意してください。これは、ユーザーがマウスを乱暴にクリックすると、mouseup イベントが乱暴にトリガーされ、狂ってしまうことを意味するためです。ピクセルを計算するためにそのループをトリガーすると、計算量が多すぎるためプロセスがブロックされ、インターフェイスがスタックしてしまいます。解決策は次のとおりです。タイムアウトを追加してピクセル計算の実行を遅らせ、毎回タイムアウトをクリアします。ユーザーがクリックした時間、つまりユーザーが長時間クリックした場合、この計算はトリガーされなくなります。上で書いた方法は、ピクセルごとにチェックすることです。ピクセル数が大きすぎると確実にスタックしてしまうので、30 ピクセルごとにチェックするなどのランダム検査を使用できます。 修正されたコードは次のとおりです:
      コードをコピー

      XML/HTML コードコンテンツをクリップボードにコピー
      1. タイムアウト = setTimeout(function(){
      2. var imgData = ctx.getImageData(0,0,canvas.width,canvas.height);
      3. var dd = 0;
      4. for(var
      5. x=0;ximgData.width;x =30){
      6. for(var
      7. y=0;yimgData.height;y =30){
      8. var
      9. i = (y*imgData.width x)*4; if(imgData.data[i 3]
      10. >
      11. 0){ dd dd
      12. }
      13. if(dd/(imgData.width*imgData.height/900)
      14. 0.4){
      15. canvas.className =
      16. "noOp"
      17. ; } },100)
      18. これにより、ユーザーが乱暴にクリックすることを最大限に防ぐことができます。他にもっと良いチェック方法がある場合は、ご意見をお聞かせください。

        このステップではすべてが書かれていましたが、結果はまだ楽観的ではなかったので、最終的に、globalCompositeOperation 属性を見つけました。このプロパティのデフォルト値は、source-over です。つまり、既存のピクセルに描画するときにオーバーレイされますが、destination-out と呼ばれるプロパティもあります。正式な説明は、次のとおりです。ソース画像。ソース イメージの外側のターゲット イメージの部分のみが表示され、ソース イメージは透明になります。理解するのが難しいように思えますが、実際に試してみると非常に簡単であることがわかります。つまり、既存のピクセルに基づいて描画すると、描画した領域内の既存のピクセルが透明になります。画像を見て直接変更できます:
        2015511164219714.jpg (553×390)

        globalCompositeOperation 属性の効果の図。
        この属性を使用すると、クリップを使用する必要がなくなり、クリッピング領域を計算するために sin や cos を使用する必要がなくなり、コストが大幅に削減されます。計算が削減され、描画環境 API の呼び出しが削減され、パフォーマンスが向上し、Android での実行がよりスムーズになるはずです。 以下は、変更されたコードです:


        XML/HTML コードコンテンツをクリップボードにコピー
        1. //globalCompositeOperation を変更して消去効果を実現
        2. 関数 TapClip(){
        3. var hastouch = "ontouchstart" in window?true:false,
        4. tapstart = hastouch?"touchstart":"mousedown",
        5. tapmove = hastouch?"touchmove":"mousemove",
        6. tapend = hastouch?"touchend":"mouseup";
        7. Canvas.addEventListener(tapstart, function(e){
        8. clearTimeout(タイムアウト)
        9. e.preventDefault();
        10. x1 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft ;
        11. y1 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop ;
        12. ctx.lineCap = "round" // 線の両端を円弧として設定します ; >
        13. ctx.lineJoin = "round" // 円弧に曲がる線を設定します
        14. ctx.lineWidth = a*2;
        15. ctx.globalCompositeOperation
        16. = "宛先出力";
        17. ctx.save();
        18. ctx.beginPath()
        19. ctx.arc(x1,y1,1,0,2*Math.PI);
        20. ctx.fill();
        21. ctx.restore();
        22. Canvas.addEventListener(tapmove, TapmoveHandler);
        23. Canvas.addEventListener(tapend, function(){
        24. Canvas.removeEventListener(tapmove, TapmoveHandler);
        25. timeout
        26. =
        27. setTimeout
        28. (function(){
        29. var imgData = ctx.getImageData(0,0,canvas.width,canvas.height);   
        30. var dd = 0;   
        31. for(var x=0;ximgData.width;x =30){
        32. for(var y=0;yimgData.height;y =30){
        33. var i = (y*imgData.width x)*4;   
        34. if(imgData.data[i 3] > 0){
        35. dd
        36. }
        37. }
        38. }
        39. if(dd/(imgData.width*imgData.height/900)0.4){
        40. canvas.className = "noOp";   
        41. }
        42. },100)
        43. });   
        44. function tapmoveHandler(e){
        45. e.preventDefault()
        46. x2 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft ;   
        47. y2 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop ;   
        48. ctx.save();   
        49. ctx.moveTo(x1,y1);   
        50. ctx.lineTo(x2,y2);   
        51. ctx.ストローク();   
        52. ctx.restore()
        53. x1 = x2;   
        54. y1 = y2;   
        55. }
        56. })
        57. }

        擦除那部分代码就这么一点,也就相当画图機能,直接設定line属性後通過lineTo行绘制線上条,只要事前操作globalCompositeOperation设在destination-out,你所行的一切绘制,都变成マウススライドのイベントフィールドコードも大幅に削減され、オブジェクトの使用回数も削減され、計算も削減され、パフォーマンスが大幅に向上しました。

        コードを変更した後、すぐに自分の Android マシンがテストを行った結果、このように、相対的に多くのストリームが送信され、少なくとも顧客の要求に応じた機能が実現されました。

        出典地址:

        https://github.com/whxaxes/canvas-test/blob/gh-pages/src/Funny-demo/clip/clip.html

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
H5とHTML5の接続:類似性と相違点H5とHTML5の接続:類似性と相違点Apr 24, 2025 am 12:01 AM

H5とHTML5は異なる概念です。HTML5は、新しい要素とAPIを含むHTMLのバージョンです。 H5は、HTML5に基づくモバイルアプリケーション開発フレームワークです。 HTML5はブラウザを介してコードを解析およびレンダリングしますが、H5アプリケーションはコンテナを実行し、JavaScriptを介してネイティブコードと対話する必要があります。

H5コードの構成要素:キー要素とその目的H5コードの構成要素:キー要素とその目的Apr 23, 2025 am 12:09 AM

HTML5の重要な要素には、最新のWebページの構築に使用される、、,,,,などが含まれます。 1.ヘッドコンテンツを定義します。2。リンクをナビゲートするために使用されます。3。独立した記事のコンテンツを表します。4。ページコンテンツを整理します。5。サイドバーコンテンツを表示します。

HTML5およびH5:一般的な使用法の理解HTML5およびH5:一般的な使用法の理解Apr 22, 2025 am 12:01 AM

HTML5とHTML5の略語であるHTML5とH5の間に違いはありません。 1.HTML5はHTMLの5番目のバージョンであり、Webページのマルチメディア関数とインタラクティブ機能を強化します。 2.H5は、HTML5ベースのモバイルWebページまたはアプリケーションを参照するためによく使用され、さまざまなモバイルデバイスに適しています。

HTML5:現代のウェブのビルディングブロック(H5)HTML5:現代のウェブのビルディングブロック(H5)Apr 21, 2025 am 12:05 AM

HTML5は、W3Cによって標準化されたHyperText Markup言語の最新バージョンです。 HTML5は、新しいセマンティックタグ、マルチメディアサポート、フォームの強化、Web構造の改善、ユーザーエクスペリエンス、SEO効果を導入します。 HTML5は、Webページ構造をより明確にし、SEO効果をより良くするために、、、、、、などの新しいセマンティックタグを導入します。 HTML5はマルチメディア要素をサポートしており、サードパーティのプラグインは不要で、ユーザーエクスペリエンスと読み込み速度が向上します。 HTML5はフォーム関数を強化し、ユーザーエクスペリエンスを向上させ、フォーム検証効率を向上させるなどの新しい入力タイプを導入します。

H5コード:クリーンで効率的なHTML5の書き込みH5コード:クリーンで効率的なHTML5の書き込みApr 20, 2025 am 12:06 AM

クリーンで効率的なHTML5コードを書き込む方法は?答えは、タグのセマンティック、構造化されたコード、パフォーマンスの最適化、一般的な間違いを回避することにより、一般的な間違いを避けることです。 1.コードの読みやすさとSEO効果を改善するには、セマンティックタグなどを使用します。 2。適切なインデントとコメントを使用して、コードを構造化して読みやすいままにします。 3.不必要なタグを減らし、CDNを使用してコードを圧縮することにより、パフォーマンスを最適化します。 4.タグが閉じていないなどの一般的な間違いを避け、コードの有効性を確認してください。

H5:ウェブ上のユーザーエクスペリエンスをどのように強化するかH5:ウェブ上のユーザーエクスペリエンスをどのように強化するかApr 19, 2025 am 12:08 AM

H5は、マルチメディアサポート、オフラインストレージ、パフォーマンスの最適化により、Webユーザーエクスペリエンスを向上させます。 1)マルチメディアサポート:H5と要素は、開発を簡素化し、ユーザーエクスペリエンスを向上させます。 2)オフラインストレージ:WebStorageとIndexEdDBは、エクスペリエンスを改善するためにオフラインで使用できるようにします。 3)パフォーマンスの最適化:ウェブワーカーと要素は、パフォーマンスを最適化して帯域幅の消費を削減します。

H5コードの分解:タグ、要素、属性H5コードの分解:タグ、要素、属性Apr 18, 2025 am 12:06 AM

HTML5コードは、タグ、要素、属性で構成されています。1。タグはコンテンツタイプを定義し、などの角度ブラケットに囲まれています。 2。要素は、startタグ、内容、および内容などのエンドタグで構成されています。 3。属性は、開始タグのキー値のペアを定義し、ような関数を強化します。これらは、Web構造を構築するための基本ユニットです。

H5コードの理解:HTML5の基礎H5コードの理解:HTML5の基礎Apr 17, 2025 am 12:08 AM

HTML5は、最新のWebページを構築するための重要なテクノロジーであり、多くの新しい要素と機能を提供します。 1。HTML5は、Webページの構造とSEOを強化するなどのセマンティック要素を導入します。 2。プラグインなしのマルチメディア要素と埋め込みメディアをサポートします。 3.フォームは、新しい入力タイプと検証プロパティを強化し、検証プロセスを簡素化します。 4.オフラインおよびローカルストレージ機能を提供して、Webページのパフォーマンスとユーザーエクスペリエンスを向上させます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター