Android 自定義LineLayout實(shí)現(xiàn)滿屏任意拖動(dòng)功能的示例代碼
1.前言
在開發(fā)中,會(huì)有需求實(shí)現(xiàn)控件在屏幕隨意拖動(dòng),這就需要自定義View,然后在OnTouchEvent事件中,處理MotionEvent.ACTION_MOVE事件,然后通過坐標(biāo)點(diǎn)傳值給onlayout方法,來實(shí)現(xiàn)控件的任意拖動(dòng),具體代碼如下:
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 */ //是否拖動(dòng) 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; //當(dāng)水平或者垂直滑動(dòng)距離大于10,才算是拖動(dòng)事件 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; } //回調(diào)移動(dòng)后的坐標(biāo)點(diǎn) if(mLocationListener!=null){ mLocationListener.locationRect((l+r)/2,(t+b)/2); } this.layout(l, t, r, 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.在代碼中的運(yùn)用
<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 加載這個(gè)xml 來實(shí)現(xiàn)任意拖動(dòng)功能
總結(jié)
到此這篇關(guān)于Android 自定義LineLayout實(shí)現(xiàn)滿屏任意拖動(dòng)功能的示例代碼的文章就介紹到這了,更多相關(guān)Android 自定義LineLayout實(shí)現(xiàn)滿屏任意拖動(dòng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android自定義View圓形和拖動(dòng)圓、跟隨手指拖動(dòng)效果
- Android ViewDragHelper仿淘寶拖動(dòng)加載效果
- android Matrix實(shí)現(xiàn)圖片隨意放大縮小或拖動(dòng)
- Android實(shí)現(xiàn)跟隨手指拖動(dòng)并自動(dòng)貼邊的View樣式(實(shí)例demo)
- Android實(shí)現(xiàn)ImageView圖片縮放和拖動(dòng)
- Android仿淘寶商品拖動(dòng)查看詳情及標(biāo)題欄漸變功能
- Android 仿淘寶、京東商品詳情頁向上拖動(dòng)查看圖文詳情控件DEMO詳解
- Android 可拖動(dòng)的seekbar自定義進(jìn)度值
- android 添加隨意拖動(dòng)的桌面懸浮窗口
相關(guān)文章
Android編程實(shí)現(xiàn)大圖滾動(dòng)顯示的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)大圖滾動(dòng)顯示的方法,涉及Android使用imageView配合onTouch事件操作圖片顯示的相關(guān)技巧,需要的朋友可以參考下2016-10-10Flutter加載圖片流程之ImageCache源碼示例解析
這篇文章主要為大家介紹了Flutter加載圖片流程之ImageCache源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Android自定義view Path 的高級用法之搜索按鈕動(dòng)畫
這篇文章主要介紹了Android自定義view Path 的高級用法之搜索按鈕動(dòng)畫,需要的朋友可以參考下2017-06-06Android進(jìn)階手寫IPC通信框架告別繁瑣AIDL
這篇文章主要為大家介紹了Android進(jìn)階手寫IPC通信框架告別繁瑣AIDL實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android SDK命令行工具M(jìn)onkey參數(shù)及使用解析
這篇文章主要介紹了Android SDK命令行工具M(jìn)onkey參,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值數(shù)及使用解析,需要的朋友可以參考下2020-10-10Android手勢密碼實(shí)現(xiàn)實(shí)例代碼
本篇文章主要介紹了Android手勢密碼實(shí)現(xiàn)實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04