Android實(shí)現(xiàn)懸浮可拖拽的Button
本文實(shí)例為大家分享了Android實(shí)現(xiàn)懸浮可拖拽Button的具體代碼,供大家參考,具體內(nèi)容如下
1、簡(jiǎn)介
最近,因?yàn)轫?xiàng)目需要,需要制作一個(gè)界面上可拖拽的按鈕,網(wǎng)上也有多實(shí)例,看了下大部分都是示例不全或講解不清晰,效果圖也不明顯,借此自己記錄一番自己的實(shí)現(xiàn)方案,以備不時(shí)之需,同時(shí)也為廣大學(xué)者可以直接通過(guò)拷貝方式完成項(xiàng)目所需。
2、效果圖
在開(kāi)始代碼之前,首先看看效果圖,如下:
3、核心代碼實(shí)現(xiàn)
3.1 DraggingButton 實(shí)現(xiàn)
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(); // 觸摸點(diǎn)與屏幕左邊的距離 lastY = (int) event.getRawY(); // 觸摸點(diǎn)與屏幕上邊的距離 beginX = lastX; beginY = lastY; break; case MotionEvent.ACTION_MOVE: int dx =(int)event.getRawX() - lastX; // x軸拖動(dòng)的絕對(duì)距離 int dy =(int)event.getRawY() - lastY; // y軸拖動(dòng)的絕對(duì)距離 // getLeft(): 子View的左邊界到父View的左邊界的距離, getRight():子View的右邊界到父View的左邊界的距離 // 如下幾個(gè)數(shù)據(jù)表示view應(yīng)該在布局中的位置 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: // 解決拖拽的時(shí)候松手點(diǎn)擊事件觸發(fā) 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); } }
核心代碼已經(jīng)奉獻(xiàn),通過(guò)自定義的DraggingButton即可實(shí)現(xiàn)可拖拽功能,具體原理主要在于onTouchEvent和layout兩個(gè)函數(shù)的使用,具體細(xì)節(jié)不在講述,代碼注釋比較清晰。
4、舉個(gè)栗子
4.1 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>
4.2 樣式 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>
4.3 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(); } });
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android開(kāi)發(fā)之FloatingActionButton懸浮按鈕基本使用、字體、顏色用法示例
- Android自定義可拖拽的懸浮按鈕DragFloatingActionButton
- Android 中FloatingActionButton(懸浮按鈕)實(shí)例詳解
- Android中FloatingActionButton實(shí)現(xiàn)懸浮按鈕實(shí)例
- Android仿知乎懸浮功能按鈕FloatingActionButton效果
- Android懸浮按鈕點(diǎn)擊返回頂部FloatingActionButton
- Android開(kāi)發(fā)懸浮按鈕 Floating ActionButton的實(shí)現(xiàn)方法
相關(guān)文章
Android 獲取屏幕高度,標(biāo)題高度,狀態(tài)欄高度(實(shí)例代碼)
getWindow().findViewById(Window.ID_ANDROID_CONTENT)這個(gè)方法獲取到的view就是程序不包括標(biāo)題欄的部分,然后就可以知道標(biāo)題欄的高度了2013-11-11Android 用Time和Calendar獲取系統(tǒng)當(dāng)前時(shí)間源碼分享(年月日時(shí)分秒周幾)
這篇文章主要介紹了Android 用Time和Calendar獲取系統(tǒng)當(dāng)前時(shí)間源碼分享,包括年月日時(shí)分秒周幾的源碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01Android 中Seekbar詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android 中Seekbar詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04Android SharedPreference存儲(chǔ)文件三步走
SharedPreferences是安卓平臺(tái)上一個(gè)輕量級(jí)的存儲(chǔ)類(lèi),用來(lái)保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時(shí),將此activity的狀態(tài)保存到SharedPereferences中;當(dāng)Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時(shí),再?gòu)腟haredPreferences中將值取出2023-01-01Android 5.0 實(shí)現(xiàn)水波擴(kuò)散效果
這篇文章主要為大家詳細(xì)介紹了Android 5.0 實(shí)現(xiàn)水波擴(kuò)散效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無(wú)刷新的問(wèn)題
這篇文章主要介紹了Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無(wú)刷新的問(wèn)題的相關(guān)資料,這里提供相應(yīng)的解決辦法,需要的朋友可以參考下2017-08-08Android實(shí)現(xiàn)未讀消息小紅點(diǎn)顯示實(shí)例
大家好,本篇文章主要講的是Android實(shí)現(xiàn)未讀消息小紅點(diǎn)顯示實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-02-02