{"id":1404,"date":"2021-07-19T17:45:31","date_gmt":"2021-07-19T09:45:31","guid":{"rendered":"https:\/\/badgameshow.com\/fly\/?p=1404"},"modified":"2021-07-23T11:10:18","modified_gmt":"2021-07-23T03:10:18","slug":"android-%e5%b0%8f%e7%95%ab%e5%ae%b6-%e7%b0%bd%e5%90%8d-%e7%95%ab%e6%9d%bf","status":"publish","type":"post","link":"https:\/\/badgameshow.com\/fly\/android-%e5%b0%8f%e7%95%ab%e5%ae%b6-%e7%b0%bd%e5%90%8d-%e7%95%ab%e6%9d%bf\/","title":{"rendered":"Android \u624b\u5beb\u7c3d\u540d \u756b\u677f"},"content":{"rendered":"<h1>Android \u624b\u5beb\u7c3d\u540d \u756b\u677f<\/h1>\n<h5>Android \u624b\u5beb\u7c3d\u540d \u756b\u677f\uff0c\u5728\u81ea\u5b9a\u7fa9View\u4e2d\uff0c\u624b\u5beb\u7c3d\u540d\u4f7f\u7528Canvas\u7684\u76f8\u61c9\u64cd\u4f5c\uff0c\u5be6\u73fe\u985e\u4f3c\u624b\u5beb\u7c3d\u540d\u7684\u756b\u677f\uff0c\u6b63\u5e38\u7684Canvas\u64cd\u4f5c\u53ef\u4ee5\u7528\u756b\u677f\u5c0d\u624b\u6a5f\u7684\u6ed1\u52d5\u9032\u884c\u7e6a\u88fd\uff0c\u624b\u5beb\u7c3d\u540d\u8b93\u4f60\u9054\u5230\u8a31\u591a\u65b9\u4fbf\u6027\uff0c\u5e6b\u52a9\u60a8\u5b8c\u6210\u5404\u7a2e\u624b\u5beb\u7c3d\u540d\u3002<\/h5>\n<hr \/>\n<h4>\u6587\u7ae0\u76ee\u9304<\/h4>\n<ol>\n<li><a href=\"#a\">\u5275\u5efaSignatureView<\/a><\/li>\n<li><a href=\"#b\">\u65b9\u6cd5\u8abf\u7528&#038;\u5e03\u5c40<\/a><\/li>\n<li><a href=\"#c\">\u6548\u679c\u5c55\u793a<\/a><\/li>\n<li><a href=\"#d\">Github<\/a><\/li>\n<\/ol>\n<hr \/>\n<p><a id=\"a\"><\/a><\/p>\n<h4>1.\u5275\u5efaSignatureView<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">import android.annotation.SuppressLint\nimport android.content.ContentValues\nimport android.content.Context\nimport android.graphics.*\nimport android.os.Build\nimport android.provider.MediaStore\nimport android.util.AttributeSet\nimport android.util.DisplayMetrics\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.WindowManager\n\n\/**\n * Author: Wade\n * E-mail: tony91097@gmail.com\n * Date: 2021\/7\/19\n *\/\n@Suppress(\"DEPRECATION\")\nclass SignatureView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {\n\n    private val path = Path()\n    private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n        color = Color.RED\n        style = Paint.Style.STROKE\n        strokeWidth = 10f\n    }\n\n    private lateinit var mBitmapCanvas: Canvas\n    private lateinit var mBitmap: Bitmap\n    private var clickX = 0f\n    private var clickY = 0f\n    private var startX = 0f\n    private var startY = 0f\n\n    init {\n        createBitmap(context)\n    }\n\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n        canvas.drawPath(path, paint)\n        mBitmapCanvas.drawPath(path, paint)\n    }\n\n    @SuppressLint(\"ClickableViewAccessibility\")\n    override fun onTouchEvent(event: MotionEvent): Boolean {\n        startX = event.x\n        startY = event.y\n        when (event.action) {\n            MotionEvent.ACTION_DOWN -&gt; {\n                clickX = startX\n                clickY = startY\n                path.moveTo(startX, startY)\n                invalidate()\n                return true\n            }\n            MotionEvent.ACTION_MOVE -&gt; {\n                path.quadTo(clickX, clickY, (clickX + startX) \/ 2, (clickY + startY) \/ 2)\n                clickX = startX\n                clickY = startY\n                invalidate()\n                return true\n            }\n            MotionEvent.ACTION_UP -&gt; return true\n            else -&gt; {\n            }\n        }\n        return super.onTouchEvent(event)\n    }\n\n    \/\/\u91cd\u88fd\u5716\u7247\n    fun resetCanvas(mainActivity: MainActivity) {\n        path.reset()\n        createBitmap(mainActivity)\n        invalidate()\n    }\n\n    \/\/\u5132\u5b58\u5716\u7247\n    fun savePicture(mainActivity: MainActivity) {\n        val contentValues = ContentValues()\n        contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, \"draw.png\")\n        contentValues.put(MediaStore.Images.Media.MIME_TYPE, \"image\/png\")\n        val uri = mainActivity.contentResolver.insert(\n            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,\n            contentValues\n        )\n\n        val outputStream = mainActivity.contentResolver.openOutputStream(uri!!)\n        mBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)\n        outputStream?.close()\n    }\n\n    \/\/\u8a2d\u5b9abitmap\u5927\u5c0f\n    private fun createBitmap(context: Context?) {\n        \/\/\u7372\u53d6\u624b\u6a5f\u986f\u793a\u76f8\u95dc\n        val displayMetrics = DisplayMetrics()\n        if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.R) {\n            display?.getRealMetrics(displayMetrics)\n        } else {\n            val windowManager: WindowManager =\n                context!!.getSystemService(Context.WINDOW_SERVICE) as WindowManager\n            windowManager.defaultDisplay.getMetrics(displayMetrics)\n        }\n\n        mBitmap = Bitmap.createBitmap(\n            displayMetrics.widthPixels,\n            displayMetrics.heightPixels,\n            Bitmap.Config.ARGB_8888\n        )\n        mBitmapCanvas = Canvas(mBitmap)\n        mBitmapCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)\n    }\n}\n<\/code><\/pre>\n<p><a id=\"b\"><\/a><\/p>\n<h4>2.\u65b9\u6cd5\u8abf\u7528&amp;\u5e03\u5c40<\/h4>\n<h5>Layout<\/h5>\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;com.example.signatureview.SignatureView\n        android:id=\"@+id\/signatureView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toTopOf=\"@+id\/appCompatButton\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" \/&gt;\n\n\n    &lt;androidx.appcompat.widget.AppCompatButton\n        android:id=\"@+id\/appCompatButton2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:onClick=\"reset\"\n        android:text=\"\u91cd\u756b\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@+id\/appCompatButton\"\n        app:layout_constraintHorizontal_bias=\"0.5\"\n        app:layout_constraintStart_toStartOf=\"parent\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatButton\n        android:onClick=\"save\"\n        android:id=\"@+id\/appCompatButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\u5132\u5b58\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.5\"\n        app:layout_constraintStart_toEndOf=\"@+id\/appCompatButton2\" \/&gt;\n\n\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;\n<\/code><\/pre>\n<h5>\u8abf\u7528<\/h5>\n<pre><code class=\"language-Kotlin line-numbers\">import androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.view.View\n\nclass MainActivity : AppCompatActivity() {\n\n    lateinit var signatureView: SignatureView\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        signatureView = findViewById(R.id.signatureView)\n    }\n\n    fun save(view: View) {\n        signatureView.savePicture(this)\n    }\n\n    fun reset(view: View) {\n        signatureView.resetCanvas(this)\n    }\n}\n<\/code><\/pre>\n<p><a id=\"c\"><\/a><\/p>\n<h4>3.\u6548\u679c\u5c55\u793a<\/h4>\n<p><a href=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2021\/07\/Screenrecorder-2021-07-19-17-40-32-684.gif\"><img decoding=\"async\" src=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2021\/07\/Screenrecorder-2021-07-19-17-40-32-684.gif\" width=\"50%\"\/><\/a><\/p>\n<p><a id=\"d\"><\/a><\/p>\n<h4>4.Github<\/h4>\n<p><a href=\"https:\/\/github.com\/MuHongWeiWei\/SignatureView\" target=\"_blank\" rel=\"noopener\">Github<\/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 \u624b\u5beb\u7c3d\u540d \u756b\u677f Android \u624b\u5beb\u7c3d\u540d \u756b\u677f\uff0c\u5728\u81ea\u5b9a\u7fa9View\u4e2d\uff0c\u624b\u5beb\u7c3d\u540d\u4f7f\u7528Canvas\u7684 &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,196],"class_list":["post-1404","post","type-post","status-publish","format-standard","hentry","category-android","tag-android","tag-kotlin","tag-196"],"_links":{"self":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1404","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=1404"}],"version-history":[{"count":5,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1404\/revisions"}],"predecessor-version":[{"id":1438,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1404\/revisions\/1438"}],"wp:attachment":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/media?parent=1404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/categories?post=1404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/tags?post=1404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}