{"id":860,"date":"2020-11-20T13:57:30","date_gmt":"2020-11-20T05:57:30","guid":{"rendered":"https:\/\/badgameshow.com\/fly\/?p=860"},"modified":"2021-09-23T13:40:11","modified_gmt":"2021-09-23T05:40:11","slug":"android-%e6%96%b0%e6%89%8b%e5%bc%95%e5%b0%8e%e9%a0%81%e9%9d%a2-%e9%81%ae%e7%bd%a9view","status":"publish","type":"post","link":"https:\/\/badgameshow.com\/fly\/android-%e6%96%b0%e6%89%8b%e5%bc%95%e5%b0%8e%e9%a0%81%e9%9d%a2-%e9%81%ae%e7%bd%a9view\/","title":{"rendered":"Android \u65b0\u624b\u5f15\u5c0e\u9801\u9762 \u906e\u7f69View"},"content":{"rendered":"<h1>Android \u65b0\u624b\u5f15\u5c0e\u9801\u9762 \u906e\u7f69View<\/h1>\n<h5>\u5c07\u81ea\u5df1\u60f3\u8981\u7684\u65b0\u624b\u5f15\u5c0e\u4ecb\u9762\u5229\u7528Mask\u7684\u5f62\u5f0f\u84cb\u5230View\u7684\u4e0a\u65b9\uff0c\u53ef\u4ee5\u5efa\u7acb\u81ea\u5b9a\u7fa9\u6aa2\u8996\u7684Mask\u5229\u7528OnDraw\u4f86\u57f7\u884c\u906e\u7f69\u3002\u4f7f\u7528\u80cc\u666f\u534a\u900f\u660e\uff0c\u906e\u7f69\u5f15\u5c0e\u5c64\u662f\u5f88\u5e38\u7528\u7684\u4e00\u500b\u529f\u80fd\uff0c\u6240\u4ee5\u6211\u81ea\u5df1\u505a\u4e00\u500b\u7bc4\u4f8b\u4f86\u5be6\u73fe\u3002<\/h5>\n<hr \/>\n<h4>\u6587\u7ae0\u76ee\u9304<\/h4>\n<ol>\n<li><a href=\"#a\">\u5275\u5efa\u906e\u7f69View<\/a><\/li>\n<li><a href=\"#b\">\u6dfb\u52a0\u906e\u7f69View<\/a><\/li>\n<li><a href=\"#c\">\u756b\u9762\u5e03\u5c40<\/a><\/li>\n<li><a href=\"#d\">View\u5716\u5c64<\/a><\/li>\n<li><a href=\"#e\">Github<\/a><\/li>\n<\/ol>\n<hr \/>\n<p><a id=\"a\"><\/a><\/p>\n<h4>1.\u5275\u5efa\u906e\u7f69View<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">package com.example.maskdemo\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.Path\nimport android.view.MotionEvent\nimport android.view.View\nimport android.widget.FrameLayout\n\n\/**\n * Author: Wade\n * E-mail: tony91097@gmail.com\n * Date: 2021\/9\/22\n *\/\n@SuppressLint(\"ViewConstructor\")\nclass MaskView(context: Context, private val decorView: FrameLayout) : View(context) {\n\n    private val path = Path()\n    private val maskPaint = Paint().apply {\n        color = Color.parseColor(\"#90000000\")\n    }\n\n    private var nextX = 0f\n    private var nextY = 0f\n    private var nextR = 0f\n\n    private var previousX = 0f\n    private var previousY = 0f\n    private var previousR = 0f\n\n    private var confirmX = 0f\n    private var confirmY = 0f\n    private var confirmR = 0f\n\n    \/\/\u8a2d\u7f6eView\u906e\u7f69\u4f4d\u5b50\n    fun setNext(view: View, radius: Float) {\n        this.nextX = view.x + view.width \/ 2\n        this.nextY = view.y + view.height \/ 2\n        this.nextR = radius\n    }\n\n    \/\/\u8a2d\u7f6eView\u906e\u7f69\u4f4d\u5b50\n    fun setPrevious(view: View, radius: Float) {\n        this.previousX = view.x + view.width \/ 2\n        this.previousY = view.y + view.height \/ 2\n        this.previousR = radius\n    }\n\n    \/\/\u8a2d\u7f6eView\u906e\u7f69\u4f4d\u5b50\n    fun setButton(view: View, radius: Float) {\n        this.confirmX = view.x + view.width \/ 2\n        this.confirmY = view.y + view.height \/ 2\n        this.confirmR = radius\n    }\n\n    \/\/CW\u9806\u6642\u91dd\u756b CCW\u9006\u6642\u91dd\u756b \u6316\u6d1e\n    override fun onDraw(canvas: Canvas?) {\n        super.onDraw(canvas)\n        canvas?.run {\n            path.addRect(0f, 0f, width.toFloat(), height.toFloat(), Path.Direction.CW)\n            path.addCircle(confirmX, confirmY, confirmR, Path.Direction.CCW)\n            path.addCircle(previousX, previousY, previousR, Path.Direction.CCW)\n            path.addCircle(nextX, nextY, nextR, Path.Direction.CCW)\n            drawPath(path, maskPaint)\n        }\n    }\n\n    \/\/\u89f8\u78b0\u5230\u6307\u5b9a\u5ea7\u6a19\u79fb\u9664\u906e\u7f69\n    @SuppressLint(\"ClickableViewAccessibility\")\n    override fun onTouchEvent(event: MotionEvent?): Boolean {\n        event?.apply {\n            if (MotionEvent.ACTION_DOWN == action) {\n                if (confirmX - confirmR &lt; event.x &amp;&amp; confirmX + confirmR &gt; event.x &amp;&amp; confirmY - confirmR &lt; event.y &amp;&amp; confirmY + confirmR &gt; event.y) {\n                    decorView.removeView(this@MaskView)\n                }\n            }\n        }\n        return true\n    }\n}\n<\/code><\/pre>\n<p><a id=\"b\"><\/a><\/p>\n<h4>2.\u6dfb\u52a0\u906e\u7f69View<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">package com.example.maskdemo\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.widget.FrameLayout\nimport androidx.appcompat.widget.AppCompatButton\nimport androidx.appcompat.widget.AppCompatImageView\n\nclass MainActivity : AppCompatActivity() {\n\n    lateinit var decorView: FrameLayout\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        \/\/\u96b1\u85cfactionbar \u4e0d\u7136\u9ad8\u5ea6\u6703\u4e0d\u540c\n        supportActionBar?.hide()\n        \/\/\u6700\u5e95\u5c64View\n        decorView = window.decorView.findViewById(android.R.id.content)\n    }\n\n    override fun onWindowFocusChanged(hasFocus: Boolean) {\n        super.onWindowFocusChanged(hasFocus)\n\n        \/\/\u53d6\u5f97View\n        val next = findViewById&lt;AppCompatImageView&gt;(R.id.next)\n        val previous = findViewById&lt;AppCompatImageView&gt;(R.id.previous)\n        val confirm = findViewById&lt;AppCompatButton&gt;(R.id.confirm)\n\n        \/\/\u8a2d\u7f6exyr\n        val maskView = MaskView(this, decorView)\n        maskView.setButton(confirm, confirm.width \/ 1.5f)\n        maskView.setNext(next, next.width \/ 1.5f)\n        maskView.setPrevious(previous, previous.width \/ 1.5f)\n\n        decorView.addView(maskView)\n    }\n}\n<\/code><\/pre>\n<p><a id=\"c\"><\/a><\/p>\n<h4>3.\u756b\u9762\u5e03\u5c40<\/h4>\n<pre><code class=\"language-XML line-numbers\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\"&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatImageView\n        android:id=\"@+id\/next\"\n        android:layout_width=\"60dp\"\n        android:layout_height=\"60dp\"\n        android:layout_marginEnd=\"50dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id\/previous\"\n        app:srcCompat=\"@drawable\/next\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatImageView\n        android:id=\"@+id\/previous\"\n        android:layout_width=\"60dp\"\n        android:layout_height=\"60dp\"\n        android:layout_marginStart=\"50dp\"\n        android:layout_marginTop=\"100dp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:srcCompat=\"@drawable\/previous\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatButton\n        android:id=\"@+id\/confirm\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\u78ba\u8a8d\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id\/next\"\n        app:layout_constraintStart_toStartOf=\"@+id\/previous\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/previous\" \/&gt;\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;\n<\/code><\/pre>\n<p><a id=\"d\"><\/a><\/p>\n<h4>4.View\u5716\u5c64<\/h4>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2020\/11\/1605850984299.jpg\"><img decoding=\"async\" src=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2020\/11\/1605850984299-300x198.jpg\" alt=\"\" \/><\/a><\/p>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2020\/11\/1605851579945.jpg\"><img decoding=\"async\" src=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2020\/11\/1605851579945-300x179.jpg\" alt=\"\" \/><\/a><\/p>\n<p><a id=\"e\"><\/a><\/p>\n<h4>5.Github<\/h4>\n<p><a href=\"https:\/\/github.com\/MuHongWeiWei\/MaskDemo\" target=\"_blank\" rel=\"noopener\">Android \u65b0\u624b\u5f15\u5c0e\u9801\u9762 \u906e\u7f69View<\/a><\/p>\n\n<div style=\"font-size: 0px; height: 0px; line-height: 0px; margin: 0; padding: 0; clear: both;\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Android \u65b0\u624b\u5f15\u5c0e\u9801\u9762 \u906e\u7f69View \u5c07\u81ea\u5df1\u60f3\u8981\u7684\u65b0\u624b\u5f15\u5c0e\u4ecb\u9762\u5229\u7528Mask\u7684\u5f62\u5f0f\u84cb\u5230View\u7684\u4e0a\u65b9\uff0c\u53ef\u4ee5 &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"pgc_sgb_lightbox_settings":"","footnotes":""},"categories":[5],"tags":[13,15,131],"class_list":["post-860","post","type-post","status-publish","format-standard","hentry","category-android","tag-android","tag-kotlin","tag-maskview"],"_links":{"self":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/comments?post=860"}],"version-history":[{"count":3,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/860\/revisions"}],"predecessor-version":[{"id":1514,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/860\/revisions\/1514"}],"wp:attachment":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/media?parent=860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/categories?post=860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/tags?post=860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}