1. 程式人生 > 程式設計 >Android 自定義LineLayout實現滿屏任意拖動功能的示例程式碼

Android 自定義LineLayout實現滿屏任意拖動功能的示例程式碼

1.前言

在開發中,會有需求實現控制元件在螢幕隨意拖動,這就需要自定義View,然後在OnTouchEvent事件中,處理MotionEvent.ACTION_MOVE事件,然後通過座標點傳值給onlayout方法,來實現控制元件的任意拖動,具體程式碼如下:

import android.content.Context;
import android.util.AttributeSet;
import android.view.Display;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.LinearLayout;

public class DragLineLayout extends LinearLayout {

  private int mWidth;
  private int mHeight;
  private int mScreenWidth;
  private int mScreenHeight;
  private Context mContext;
  private onLocationListener mLocationListener;/*listen to the Rect */
  //是否拖動
  private boolean isDrag = false;

  public boolean isDrag() {
    return isDrag;
  }

  public DragView(Context context,AttributeSet attrs) {
    super(context,attrs);
    this.mContext = context;
  }

  @Override
  protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);
    mWidth = getMeasuredWidth();
    mHeight = getMeasuredHeight();
    mScreenWidth = getScreenWidth(mContext);
    mScreenHeight = getScreenHeight(mContext) - getStatusBarHeight();
  }

  public int getStatusBarHeight() {
    int resourceId = mContext.getResources().getIdentifier("status_bar_height","dimen","android");
    return mContext.getResources().getDimensionPixelSize(resourceId);
  }

  public int getScreenWidth(Context context) {
    WindowManager manager = (WindowManager) context
        .getSystemService(Context.WINDOW_SERVICE);
    Display display = manager.getDefaultDisplay();
    return display.getWidth();
  }

  public int getScreenHeight(Context context) {
    WindowManager manager = (WindowManager) context
        .getSystemService(Context.WINDOW_SERVICE);
    Display display = manager.getDefaultDisplay();
    return display.getHeight();
  }

  private float mDownX;
  private float mDownY;


  @Override
  public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);
    if (this.isEnabled()) {
      switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
          isDrag = false;
          mDownX = event.getX();
          mDownY = event.getY();
          break;
        case MotionEvent.ACTION_MOVE:
          final float mXdistance = event.getX() - mDownX;
          final float mYdistance = event.getY() - mDownY;
          int l,r,t,b;
          //當水平或者垂直滑動距離大於10,才算是拖動事件
          if (Math.abs(mXdistance) > 10 || Math.abs(mYdistance) > 10) {
            isDrag = true;
            l = (int) (getLeft() + mXdistance);
            r = l + mWidth;
            t = (int) (getTop() + mYdistance);
            b = t + mHeight;
            //邊界判斷,不讓佈局滑出介面
            if (l < 0) {
              l = 0;
              r = l + mWidth;
            } else if (r > mScreenWidth) {
              r = mScreenWidth;
              l = r - mWidth;
            }
            if (t < 0) {
              t = 0;
              b = t + mHeight;
            } else if (b > mScreenHeight) {
              b = mScreenHeight;
              t = b - mHeight;
            }
            //回撥移動後的座標點
            if(mLocationListener!=null){
              mLocationListener.locationRect((l+r)/2,(t+b)/2);
            }
            this.layout(l,b);
          }
          break;
        case MotionEvent.ACTION_UP:
          setPressed(false);
          break;
        case MotionEvent.ACTION_CANCEL:
          setPressed(false);
          break;
      }
      return true;
    }
    return false;
  }
  public void setLocationListener(onLocationListener LocationListener) {
    this.mLocationListener = LocationListener;
  }
  public interface onLocationListener {
    void locationRect(float locationX,float locationY);
  }
}

2.在程式碼中的運用

<com.xinrui.guestservice.view.DragLineLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="@dimen/dp_200"
  android:layout_height="@dimen/dp_110"
  android:orientation="vertical">
  <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_50">
  <EditText
    android:id="@+id/input_edt"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_50"
    android:background="@drawable/edit_bg" />
  </RelativeLayout>
  <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_55"
    android:layout_marginTop="@dimen/margin_5"
    android:background="@drawable/paint_bg">

    <TextView
      android:id="@+id/paint_typeface"
      android:layout_width="@dimen/dp_50"
      android:layout_height="@dimen/dp_50"
      android:layout_alignParentLeft="true"
      android:layout_alignParentTop="true"
      android:layout_marginTop="@dimen/margin_5"
      android:background="@drawable/main_selector_write"
      android:clickable="true" />

    <TextView
      android:id="@+id/paint_fontsize"
      android:layout_width="@dimen/dp_50"
      android:layout_height="@dimen/dp_50"
      android:layout_alignParentTop="true"
      android:layout_marginLeft="@dimen/dp_10"
      android:layout_marginTop="@dimen/margin_5"
      android:layout_toRightOf="@id/paint_typeface"
      android:background="@drawable/main_selector_write"
      android:clickable="true" />
  </RelativeLayout>
</com.xinrui.guestservice.view.DragLineLayout>

3.這樣就可以在Activity 載入這個xml 來實現任意拖動功能

總結

到此這篇關於Android 自定義LineLayout實現滿屏任意拖動功能的示例程式碼的文章就介紹到這了,更多相關Android 自定義LineLayout實現滿屏任意拖動內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!