Android-滿屏幕拖動的控件
?
今天做個有意思的效果吧,控件的拖拽,先看一下模擬器執行:
也就是,用戶能夠隨心所欲的拖動控件,布局文件非常easy就是一個Button控件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"? ?android:id="@+id/root"
? ?android:layout_width="match_parent"
? ?android:layout_height="match_parent">
? ?<Button
? ? ? ?android:id="@+id/id_text"
? ? ? ?android:layout_width="wrap_content"
? ? ? ?android:layout_height="wrap_content"
? ? ? ?android:text="Hello World!" />
</RelativeLayout>
MainActivity.java:
package com.example.administrator.followview;
public class MainActivity extends Activity implements View.OnTouchListener {
? ?private Button mButton;
? ?private ViewGroup mViewGroup;
? ?private int xDelta;
? ?private int yDelta;
? ?public static final String TAG = "YAYUN";
? ?@Override? ?public void onCreate(Bundle savedInstanceState) {
? ? ? ?super.onCreate(savedInstanceState);
? ? ? ?setContentView(R.layout.activity_main);
? ? ? ?mViewGroup = (ViewGroup) findViewById(R.id.root);
? ? ? ?mButton = (Button) findViewById(R.id.id_text);
? ? ? ?RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
? ? ? ? ? ? ? ?ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
? ? ? ?layoutParams.leftMargin = 50;
? ? ? ?layoutParams.topMargin = 50;
? ? ? ?mButton.setLayoutParams(layoutParams);
? ? ? ?mButton.setOnTouchListener(this);
? ?}
? ?@Override
? ?public boolean onTouch(View view, MotionEvent event) {
? ? ? ?final int x = (int) event.getRawX();
? ? ? ?final int y = (int) event.getRawY();
? ? ? ?Log.d(TAG, "onTouch: x= " + x + "y=" + y);
? ? ? ?switch (event.getAction() & MotionEvent.ACTION_MASK) {
? ? ? ? ? ?case MotionEvent.ACTION_DOWN:
? ? ? ? ? ? ? ?RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view
? ? ? ? ? ? ? ? ? ? ? ?.getLayoutParams();
? ? ? ? ? ? ? ?xDelta = x - params.leftMargin;
? ? ? ? ? ? ? ?yDelta = y - params.topMargin;
? ? ? ? ? ? ? ?Log.d(TAG, "ACTION_DOWN: xDelta= " + xDelta + "yDelta=" + yDelta);
? ? ? ? ? ? ? ?break;
? ? ? ? ? ?case MotionEvent.ACTION_MOVE:
? ? ? ? ? ? ? ?RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
? ? ? ? ? ? ? ? ? ? ? ?.getLayoutParams();
? ? ? ? ? ? ? ?int xDistance = x - xDelta;
? ? ? ? ? ? ? ?int yDistance = y - yDelta;
? ? ? ? ? ? ? ?Log.d(TAG, "ACTION_MOVE: xDistance= " + xDistance + "yDistance=" + yDistance);
? ? ? ? ? ? ? ?layoutParams.leftMargin = xDistance;
? ? ? ? ? ? ? ?layoutParams.topMargin = yDistance;
? ? ? ? ? ? ? ?view.setLayoutParams(layoutParams);
? ? ? ? ? ? ? ?break;
? ? ? ?}
? ? ? ?mViewGroup.invalidate();
? ? ? ?return true;
? ?}
}
MainActivity實現了OnTouchListener接口,覆寫了onTouch方法,每次回調這種方法通過x和y變量記錄當前的坐標。
ACTION_DOWN是在按下的時候調用(沒擡起來僅僅調用一次),通過xDelta和yDelta來記錄第一次按下的點相對於控件左上角的位置,也就是相對距離。
ACTION_MOVE移動的時候不斷調用,通過xDistance和yDistance來記錄移動的相對距離作為leftMargin和topMargin再動態設置給控件。
最後,調用invalidate方法更新控件位置。
解釋起來不easy解釋,理解起來也不easy理解,我們能夠看一下Log。幫助理解:
按下的時候,首先打印當前的坐標為(131,75),因為在onCreate方法中設置了初始的leftMargin和topMargin都為50。所以此時xDelta的值為131-50=81。yDelta的值為75-50=25。第一個ACTION_MOVE的xDistance為132-81=51,yDistance的值為80-25=55,同理,後面都是循環調用了。
這裏主要要註意相對的概念,計算的都是相對距離。
這個效果直接用到的場景不多。可是裏面的處理思路都是在開發中常常會用到的。onTouch方法也是控件交互常常會用到的方法,這方面要非常熟悉。
希望這個簡單的實例能夠給大家帶來思維的碰撞。
作者準備這篇文章要60分鐘。讀者讀完這篇文章可能少於6分鐘。您分享它不多於6秒鐘,朋友圈讓我們體會到了沒有成本的分享是多麼快樂的一件事~
謝謝關註我的微信公眾號,認為好能夠分享到朋友圈哦.
請關註我的新浪微博:AndroidTip
CSDN博客:http://blog.csdn.net/yayun0516
Android-滿屏幕拖動的控件