按钮的拖动
- 确定移动按钮的区域
- 为按钮设置触摸事件
- 使用 layout(l,t,r,b);设置在父布局中的位置
- 调用postInvalidate()方法进行重新绘制。
layout参数说明
获取父布局的高度
直接使用getHeight()获取出来的宽高都是0,正确的方式应该使用以下方式:
view.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
parentHeight=fl_parent.getMeasuredHeight();
Log.i("aa", "parentHeight:"+parentHeight);
}
详细代码如下:
package com.example.pulltorefreshdemo.fragment;
import com.example.pulltorefreshdemo.R;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
importandroid.view.ViewTreeObserver.OnGlobalLayoutListene;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
public class FirstFragment extends Fragment {
private TextView tv_move;
private FrameLayout fl_parent;
private int lastRx;
private int lastRy;
private int comX;
private int comY;
private int screenWidth;
private int screenHeight;
private int parentHeight;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.item_move, container, false);
initView(view);
getScreeWH();
return view;
}
/**
* 获取屏幕宽高
*/
public void getScreeWH(){
WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
screenWidth = wm.getDefaultDisplay().getWidth();
screenHeight= wm.getDefaultDisplay().getHeight();
}
public void initView(View view) {
tv_move = (TextView) view.findViewById(R.id.tv_move);
fl_parent=(FrameLayout) view.findViewById(R.id.fl_parent);
view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
parentHeight=fl_parent.getMeasuredHeight();
Log.i("aa", "parentHeight:"+parentHeight);
}
});
tv_move.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("aa", "parentHeight:"+parentHeight);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastRx=(int) event.getRawX();
lastRy=(int) event.getRawY();
case MotionEvent.ACTION_MOVE:
int dx=(int) (event.getRawX()-lastRx);
int dy=(int) (event.getRawY()-lastRy);
Log.i("aa", "dx:"+dx+"--dy:"+dy);
int l=v.getLeft()+dx;
int t=v.getTop()+dy;
int r=v.getRight()+dx;
int b=v.getBottom()+dy;
if(l<0){
l=0;
r=v.getWidth()+l;
}
if(t<0){
t=0;
b=v.getHeight()+t;
}
if(r>screenWidth){
r=screenWidth;
l=r-v.getWidth();
}
if(b>parentHeight){
b=parentHeight;
t=b-v.getHeight();
}
tv_move.layout(l, t, r, b);
lastRx = (int) event.getRawX();
lastRy = (int) event.getRawY();
tv_move.postInvalidate();
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return false;
}
});
tv_move.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i("aa", "onClick");
}
});
}
}