您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Android如何實現懸浮可拖拽的Button的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
簡介
最近,因為項目需要,需要制作一個界面上可拖拽的按鈕,網上也有多實例,看了下大部分都是示例不全或講解不清晰,效果圖也不明顯,借此自己記錄一番自己的實現方案,以備不時之需,同時也為廣大學者可以直接通過拷貝方式完成項目所需。
核心代碼實現
1DraggingButton 實現
public class DraggingButton extends android.support.v7.widget.AppCompatButton { private int lastX = 0; private int lastY = 0; private int beginX = 0; private int beginY = 0; private int screenWidth = 720; private int screenHeight = 1280; public DraggingButton(Context context) { this(context, null); } public DraggingButton(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public DraggingButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initData(context); } private void initData(Context context){ WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(dm); screenWidth = dm.widthPixels; screenHeight = dm.heightPixels; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); // 觸摸點與屏幕左邊的距離 lastY = (int) event.getRawY(); // 觸摸點與屏幕上邊的距離 beginX = lastX; beginY = lastY; break; case MotionEvent.ACTION_MOVE: int dx =(int)event.getRawX() - lastX; // x軸拖動的絕對距離 int dy =(int)event.getRawY() - lastY; // y軸拖動的絕對距離 // getLeft(): 子View的左邊界到父View的左邊界的距離, getRight():子View的右邊界到父View的左邊界的距離 // 如下幾個數據表示view應該在布局中的位置 int left = getLeft() + dx; int top = getTop() + dy; int right = getRight() + dx; int bottom = getBottom() + dy; if(left < 0){ left = 0; right = left + getWidth(); } if(right > screenWidth){ right = screenWidth; left = right - getWidth(); } if(top < 0){ top = 0; bottom = top + getHeight(); } if(bottom>screenHeight){ bottom = screenHeight; top = bottom - getHeight(); } layout(left, top, right, bottom); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: // 解決拖拽的時候松手點擊事件觸發 if (Math.abs(lastX - beginX) < 10 && Math.abs(lastY - beginY) < 10){ return super.onTouchEvent(event); }else{ setPressed(false); return true; } default: break; } return super.onTouchEvent(event); }}
核心代碼已經奉獻,通過自定義的DraggingButton即可實現可拖拽功能,具體原理主要在于onTouchEvent和layout兩個函數的使用,具體細節不在講述,代碼注釋比較清晰。
舉個栗子
activity中的布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.android.study.example.uidemo.dragging.DraggingButton android:id="@+id/tv_dragging" android:layout_width="80dp" android:layout_height="80dp" android:gravity="center" android:background="@drawable/drag_button_bg" android:layout_margin="20dp" android:padding="10dp" android:text="懸浮\n按鈕1" android:textSize="15sp" android:layout_gravity="right" android:textColor="#ffffff"/></LinearLayout>
樣式 drag_button_bg.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="oval"> <!--填充顏色--> <solid android:color="#bf39b500" /> <!--描邊--> <stroke android:width="2dp" android:color="#bf39b500" /> </shape> </item> <item> <shape android:shape="oval"> <!--填充顏色--> <solid android:color="#ff8bc34a" /> <!--描邊--> <stroke android:width="2dp" android:color="#bf39b500"/> </shape> </item></selector>
activity 中的代碼
private DraggingButton mDraggintView;mDraggintView = (DraggingButton) findViewById(R.id.tv_dragging); mDraggintView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(FloatingActionBtnTestActivity.this, "click", Toast.LENGTH_SHORT).show(); } });
感謝各位的閱讀!關于“Android如何實現懸浮可拖拽的Button”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。