欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现单页面浮层可拖动view的一种方法

程序员文章站 2023-12-17 13:39:34
上一篇讲到通过通过goolge官方的viewdraghelper工具实现拖动的方法(上一篇见),那么有一个问题就是在dragframelayout中的ontoucheven...

上一篇讲到通过通过goolge官方的viewdraghelper工具实现拖动的方法(上一篇见),那么有一个问题就是在dragframelayout中的ontouchevent一直接收不到触摸消息,而且在onintercepttouchevent的时候,并没有触发viewdraghelper.trycaptureview方法,因此诞生了另一种比较原始的方法:通过自定义可拖动view来实现

主要方法:

initedge:设置可拖动view能拖动范围的初始边界,一般情况下为父布局的边界。注意view.getleft...等会获取到会0,我是在网路数据返回的情况下设置边界,并显示的。也有方法开一个子线程获取。

ontouchevent:拖动的计算以及重新layout

代码:

import android.content.context;
import android.support.annotation.nullable;
import android.support.v7.widget.appcompatimageview;
import android.util.attributeset;
import android.view.motionevent;

/**
 * created by hq on 2017/10/10.
 * 参考:http://blog.csdn.net/zane_xiao/article/details/51188867
 */

public class dragimageview extends appcompatimageview {
  string tag = "dragimageview";

  public dragimageview(context context) {
    this(context, null);
  }

  public dragimageview(context context, @nullable attributeset attrs) {
    this(context, attrs, 0);
  }

  public dragimageview(context context, @nullable attributeset attrs, int defstyleattr) {
    super(context, attrs, defstyleattr);
  }

  /**
   * 设置在父布局中的边界
   * @param l
   * @param t
   * @param r
   * @param b
   */
  public void initedge(int l,int t,int r,int b) {
    edgeleft = l;
    edgetop = t;
    edgeright = r;
    edgebottom = b;
  }

  int edgeleft, edgetop, edgeright, edgebottom;
  int lastx, lasty, movex, movey, dx, dy;

  @override
  public boolean ontouchevent(motionevent event) {
    switch (event.getaction()) {
      case motionevent.action_down:
        lastx = (int) event.getrawx();
        lasty = (int) event.getrawy();
        movex = lastx;
        movey = lasty;
        break;
      case motionevent.action_move:
        dx = (int) event.getrawx() - lastx;
        dy = (int) event.getrawy() - lasty;

        int left = getleft() + dx;
        int top = gettop() + dy;
        int right = getright() + dx;
        int bottom = getbottom() + dy;
        if (left < edgeleft) {
          left = edgeleft;
          right = left + getwidth();
        }
        if (right > edgeright) {
          right = edgeright;
          left = right - getwidth();
        }
        if (top < edgetop) {
          top = edgetop;
          bottom = top + getheight();
        }
        if (bottom > edgebottom) {

          bottom = edgebottom;
          top = bottom - getheight();
        }

        layout(left, top, right, bottom);
        lastx = (int) event.getrawx();
        lasty = (int) event.getrawy();
        break;
      case motionevent.action_up:
        //避免滑出触发点击事件
        if ((int) (event.getrawx() - movex) != 0
          || (int) (event.getrawy() - movey) != 0) {
          return true;
        }
        break;
      default:
        break;
    }
    return super.ontouchevent(event);
  }
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<framelayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/df_content"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.windfindtech.ishanghai.view.swipescrollview
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/default_white"
  android:scrollbars="none">

  <relativelayout
    android:id="@+id/network_tab_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/default_white">

    ...........

  </relativelayout>
</com.windfindtech.ishanghai.view.swipescrollview>

<com.windfindtech.ishanghai.view.dragimageview
  android:id="@+id/iv_drag_adver"
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:layout_gravity="right|top"
  android:src="@drawable/ic_launcher" />
</framelayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: