最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實(shí)現(xiàn)懸浮可拖拽的Button

 更新時(shí)間:2019年06月25日 11:26:42   作者:Sky#boy  
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)懸浮可拖拽的Button,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android編程實(shí)現(xiàn)讀取本地SD卡圖片的方法

    Android編程實(shí)現(xiàn)讀取本地SD卡圖片的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)讀取本地SD卡圖片的方法,涉及Android針對(duì)文件讀取及判定操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Android 8.0的緩存大小和緩存清理接口方法

    Android 8.0的緩存大小和緩存清理接口方法

    今天小編就為大家分享一篇Android 8.0的緩存大小和緩存清理接口方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Android Studio 中的Gradle構(gòu)建系統(tǒng)示例

    Android Studio 中的Gradle構(gòu)建系統(tǒng)示例

    這篇文章主要介紹了Android Studio 中的Gradle構(gòu)建系統(tǒng)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Flutter?GridView顯示隨機(jī)單詞效果

    Flutter?GridView顯示隨機(jī)單詞效果

    這篇文章主要為大家詳細(xì)介紹了Flutter?GridView顯示隨機(jī)單詞效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Flutter實(shí)現(xiàn)紅包動(dòng)畫(huà)效果的示例代碼

    Flutter實(shí)現(xiàn)紅包動(dòng)畫(huà)效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Flutter實(shí)現(xiàn)紅包的動(dòng)畫(huà)效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-06-06
  • Android通過(guò)SeekBar調(diào)節(jié)布局背景顏色

    Android通過(guò)SeekBar調(diào)節(jié)布局背景顏色

    這篇文章主要為大家詳細(xì)介紹了Android通過(guò)SeekBar調(diào)節(jié)布局背景顏色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android創(chuàng)建外部lib庫(kù)及自定義View的圖文教程

    Android創(chuàng)建外部lib庫(kù)及自定義View的圖文教程

    這篇文章主要給大家介紹了關(guān)于Android創(chuàng)建外部lib庫(kù)及自定義View的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • app 請(qǐng)求服務(wù)器json數(shù)據(jù)實(shí)例代碼

    app 請(qǐng)求服務(wù)器json數(shù)據(jù)實(shí)例代碼

    下面小編就為大家分享一篇app 請(qǐng)求服務(wù)器json數(shù)據(jù)實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 功能強(qiáng)大的登錄界面Android實(shí)現(xiàn)代碼

    功能強(qiáng)大的登錄界面Android實(shí)現(xiàn)代碼

    這篇文章主要為大家分享了功能強(qiáng)大的登錄界面Android實(shí)現(xiàn)代碼,驗(yàn)證碼制作方法,自帶一鍵刪除功能,用戶名密碼為空時(shí)抖動(dòng)提示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android 中okhttp自定義Interceptor(緩存攔截器)

    Android 中okhttp自定義Interceptor(緩存攔截器)

    這篇文章主要介紹了Android 中okhttp自定義Interceptor(緩存攔截器)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

襄汾县| 蛟河市| 德保县| 南通市| 铁岭市| 马山县| 上蔡县| 大庆市| 青阳县| 铜鼓县| 宁德市| 吉隆县| 银川市| 四平市| 平顶山市| 石河子市| 莱芜市| 农安县| 定襄县| 游戏| 高清| 色达县| 澄迈县| 高邮市| 怀来县| 黄平县| 民县| 湖北省| 桂阳县| 五华县| 东方市| 松溪县| 佛学| 夏津县| 渭南市| 鹤峰县| 封开县| 阳谷县| 汉沽区| 岳阳市| 乌什县|