{"id":341,"date":"2020-04-07T13:12:57","date_gmt":"2020-04-07T05:12:57","guid":{"rendered":"https:\/\/badgameshow.com\/fly\/?p=341"},"modified":"2020-05-19T13:37:39","modified_gmt":"2020-05-19T05:37:39","slug":"android-%e8%87%aa%e5%ae%9a%e7%be%a9%e6%8b%96%e7%a7%bb%e7%9a%84view","status":"publish","type":"post","link":"https:\/\/badgameshow.com\/fly\/android-%e8%87%aa%e5%ae%9a%e7%be%a9%e6%8b%96%e7%a7%bb%e7%9a%84view\/","title":{"rendered":"Android \u81ea\u5b9a\u7fa9\u62d6\u79fb\u7684View"},"content":{"rendered":"<h3>1.\u5148\u5275\u5efa\u4e00\u500b\u985e\u7e7c\u627f\u4f60\u60f3\u8981\u7684View\u4e26\u5be6\u73fe\u524d\u4e09\u500b\u69cb\u9020\u65b9\u6cd5<\/h3>\n<pre><code class=\"language-Java line-numbers\">public class DragFloatActionButton extends androidx.appcompat.widget.AppCompatImageView {\n\n    public DragFloatActionButton(Context context) {\n        super(context);\n    }\n\n    public DragFloatActionButton(Context context, @Nullable AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public DragFloatActionButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n}\n<\/code><\/pre>\n<h3>2.\u8907\u5beb\u89f8\u63a7\u65b9\u6cd5<\/h3>\n<pre><code class=\"language-Java line-numbers\">@SuppressLint(\"ClickableViewAccessibility\")\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        return true;\n    }\n<\/code><\/pre>\n<h3>3.\u53d6\u5f97\u89f8\u78b0\u7684X,Y\u5ea7\u6a19<\/h3>\n<pre><code class=\"language-Java line-numbers\">int rawX = (int) event.getRawX();\nint rawY = (int) event.getRawY();\n<\/code><\/pre>\n<h3>4.\u5224\u65b7 \u6309\u4e0b,\u79fb\u52d5,\u62ac\u8d77\u4e09\u7a2e\u64cd\u4f5c\u6a21\u5f0f<\/h3>\n<pre><code class=\"language-Java line-numbers\">switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                Log.d(\"event\", \"ACTION_DOWN\");\n                break;\n            case MotionEvent.ACTION_MOVE:\n                Log.d(\"event\", \"ACTION_MOV\");\n                break;\n            case MotionEvent.ACTION_UP:\n                Log.d(\"event\", \"ACTION_UP\");\n                break;\n        }\n<\/code><\/pre>\n<h3>5.\u6309\u4e0b\u52d5\u4f5c(ACTION_DOWN)<\/h3>\n<pre><code class=\"language-Java line-numbers\">  \/\/\u53d6\u5f97\u6309\u4e0b\u6642\u9593\n  startTime = System.currentTimeMillis();\n  \/\/\u4e0d\u8981\u8b93\u7236\u63a7\u4ef6\u6514\u622a\u4e8b\u4ef6\n  getParent().requestDisallowInterceptTouchEvent(true);\n  lastX = rawX;\n  lastY = rawY;\n\n  if (getParent() != null) {\n  \/\/\u53d6\u5f97\u7236\u63a7\u4ef6\u7684\u5bec\u9ad8\n  ViewGroup parent = (ViewGroup) getParent();\n  parentHeight = parent.getHeight();\n  parentWidth = parent.getWidth();\n<\/code><\/pre>\n<h3>6.\u79fb\u52d5\u4e8b\u4ef6(ACTION_MOVE)<\/h3>\n<pre><code class=\"language-Java line-numbers\">\/\/\u79fb\u52d5\u5ea7\u6a19-\u6700\u5f8c\u4e00\u6b21\u5ea7\u6a19\nint dx = rawX - lastX;\nint dy = rawY - lastY;\n\nfloat x = getX() + dx;\nfloat y = getY() + dy;\n\nx = x &lt; 0 ? 0 : x &gt; parentWidth - getWidth() ? parentWidth - getWidth() : x;\ny = getY() &lt; 0 ? 0 : getY() + getHeight() &gt; parentHeight ? parentHeight - getHeight() : y;\nsetX(x);\nsetY(y);\nlastX = rawX;\nlastY = rawY;\n<\/code><\/pre>\n<pre><code><\/code><\/pre>\n<h3>7.\u62ac\u8d77\u4e8b\u4ef6(ACTION_UP)<\/h3>\n<pre><code class=\"language-Java line-numbers\">\/\/\u53d6\u5f97\u6700\u5f8c\u62ac\u8d77\u6642\u9593\nlong endTime = System.currentTimeMillis();\nif (endTime - startTime &lt; 100) {\n      Log.d(\"event\", \"\u9ede\u64ca\");\n      \/\/\u89f8\u767c\u9ede\u64ca\u4e8b\u4ef6\n      performClick();\n} else {\n      Log.d(\"event\", \"\u62d6\u79fb\");\n}\n\nif (rawX &gt;= parentWidth \/ 2) {\n  \/\/\u9760\u53f3\u5438\u9644\n   animate().setInterpolator(new DecelerateInterpolator())\n            .setDuration(500)\n            .xBy(parentWidth - getWidth() - getX())\n            .start();\n} else {\n   \/\/\u9760\u5de6\u5438\u9644\n   ObjectAnimator oa = ObjectAnimator.ofFloat(this, \"x\", getX(), 0);\n   oa.setInterpolator(new DecelerateInterpolator());\n   oa.setDuration(500);\n}\n<\/code><\/pre>\n<h3>8.\u5b8c\u6574\u7a0b\u5f0f\u78bc<\/h3>\n<pre><code class=\"language-Java line-numbers\">import android.animation.ObjectAnimator;\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.MotionEvent;\nimport android.view.ViewGroup;\nimport android.view.animation.DecelerateInterpolator;\n\nimport androidx.annotation.Nullable;\n\npublic class DragFloatActionButton extends androidx.appcompat.widget.AppCompatImageView {\n\n    private long startTime;\n    private int lastX;\n    private int lastY;\n    private int parentHeight;\n    private int parentWidth;\n\n    public DragFloatActionButton(Context context) {\n        super(context);\n    }\n\n    public DragFloatActionButton(Context context, @Nullable AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public DragFloatActionButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @SuppressLint(\"ClickableViewAccessibility\")\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        int rawX = (int) event.getRawX();\n        int rawY = (int) event.getRawY();\n\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                startTime = System.currentTimeMillis();\n                \/\/\u4e0d\u8981\u8b93\u7236\u63a7\u4ef6\u6514\u622a\u4e8b\u4ef6\n                getParent().requestDisallowInterceptTouchEvent(true);\n                lastX = rawX;\n                lastY = rawY;\n\n                if (getParent() != null) {\n                    \/\/\u53d6\u5f97\u7236\u63a7\u4ef6\u7684\u5bec\u9ad8\n                    ViewGroup parent = (ViewGroup) getParent();\n                    parentHeight = parent.getHeight();\n                    parentWidth = parent.getWidth();\n                }\n                break;\n            case MotionEvent.ACTION_MOVE:\n                \/\/\u79fb\u52d5\u5ea7\u6a19-\u6700\u5f8c\u4e00\u6b21\u5ea7\u6a19\n                int dx = rawX - lastX;\n                int dy = rawY - lastY;\n\n                float x = getX() + dx;\n                float y = getY() + dy;\n\n                x = x &lt; 0 ? 0 : x &gt; parentWidth - getWidth() ? parentWidth - getWidth() : x;\n                y = getY() &lt; 0 ? 0 : getY() + getHeight() &gt; parentHeight ? parentHeight - getHeight() : y;\n                setX(x);\n                setY(y);\n                lastX = rawX;\n                lastY = rawY;\n                break;\n            case MotionEvent.ACTION_UP:\n                long endTime = System.currentTimeMillis();\n\n                if (endTime - startTime &lt; 100) {\n                    Log.d(\"event\", \"\u9ede\u64ca\");\n                    performClick();\n                } else {\n                    Log.d(\"event\", \"\u62d6\u79fb\");\n                }\n\n                if (rawX &gt;= parentWidth \/ 2) {\n                    \/\/\u9760\u53f3\u5438\u9644\n                    animate().setInterpolator(new DecelerateInterpolator())\n                            .setDuration(500)\n                            .xBy(parentWidth - getWidth() - getX())\n                            .start();\n                } else {\n                    \/\/\u9760\u5de6\u5438\u9644\n                    ObjectAnimator oa = ObjectAnimator.ofFloat(this, \"x\", getX(), 0);\n                    oa.setInterpolator(new DecelerateInterpolator());\n                    oa.setDuration(500);\n                    oa.start();\n                }\n                break;\n        }\n        return true;\n    }\n}\n<\/code><\/pre>\n\n<div style=\"font-size: 0px; height: 0px; line-height: 0px; margin: 0; padding: 0; clear: both;\"><\/div>","protected":false},"excerpt":{"rendered":"<p>1.\u5148\u5275\u5efa\u4e00\u500b\u985e\u7e7c\u627f\u4f60\u60f3\u8981\u7684View\u4e26\u5be6\u73fe\u524d\u4e09\u500b\u69cb\u9020\u65b9\u6cd5 public class DragFloatActi &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,14,33],"class_list":["post-341","post","type-post","status-publish","format-standard","hentry","category-android","tag-android","tag-java","tag-view"],"_links":{"self":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/341","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=341"}],"version-history":[{"count":3,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/341\/revisions"}],"predecessor-version":[{"id":454,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/341\/revisions\/454"}],"wp:attachment":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/media?parent=341"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/categories?post=341"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/tags?post=341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}