原理:实现OnTouchListener通过重写onTouch()方法来实现,下面是主要代码:
布局:
android:layout_width="50dp"
android:layout_height="50dp"
android:orientation="horizontal"
android:background="#ffff00"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="horizontal">
android:layout_height="wrap_content"
android:padding="5px"
android:text="当前坐标:"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5px"
android:text="0,0"/>
MainActivity
package com.anqiansong.customview;
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity implements OnTouchListener{
private LinearLayout moveView;
private int currentX;
private int currentY;
private TextView xy;
private int width;
private int height;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
DisplayMetrics dmDisplayMetrics=this.getResources().getDisplayMetrics();
width=dmDisplayMetrics.widthPixels;
height=dmDisplayMetrics.heightPixels;
moveView = (LinearLayout) findViewById(R.id.moveView);
xy = (TextView) findViewById(R.id.xy);
moveView.setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
currentX = (int) event.getRawX();
currentY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int x2 = (int) event.getRawX();
int y2 = (int) event.getRawY();
LayoutParams params=(LayoutParams) view.getLayoutParams();
params.leftMargin+=x2-currentX;
params.topMargin+=y2-currentY;
view.setLayoutParams(params);
currentX = x2;
currentY = y2;
xy.setText(x2 + "," + y2);
break;
case MotionEvent.ACTION_UP:
int left=view.getLeft();
int base=(width-view.getWidth())/2;
LayoutParams params2=(LayoutParams) view.getLayoutParams();
if(left>base){
params2.leftMargin=width-view.getWidth();
}else{
params2.leftMargin=0;
}
view.setLayoutParams(params2);
break;
}
return true;
}
}
效果图: