效果图
自定义布局
import android.content.Context;
import android.graphics.Point;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
/**
* Created by yebin on 2016/12/8.
*/
public class VDHLayout extends RelativeLayout{
private View autoBackView;
private ViewDragHelper mDragger;
private Point mAutoBackOriginPos=new Point();
private int mWidth;
private int mHeight;
public VDHLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void addBackView(View view){
this.autoBackView=view;
if(autoBackView!=null){
addView(autoBackView);
inintViewDragHelper();
}
}
private void inintViewDragHelper() {
mDragger=ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(View child, int pointerId) {
return child==autoBackView;
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
int leftBound=getPaddingLeft();
int rightBound=getWidth()-child.getWidth()-leftBound;
int newLeft=Math.min(Math.max(left,leftBound),rightBound);
return newLeft;
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
int topBound=getPaddingTop();
int bottomBound=getHeight()-child.getHeight()-topBound;
int newTop=Math.min(Math.max(top,topBound),bottomBound);
return newTop;
}
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);
if(changedView==autoBackView){
mAutoBackOriginPos.y=top;
if(left<mWidth/2){
mAutoBackOriginPos.x=0;
}else{
mAutoBackOriginPos.x=mWidth-autoBackView.getWidth();
}
}
}
@Override
public int getViewHorizontalDragRange(View child) {
return getMeasuredWidth()-child.getMeasuredWidth();
}
@Override
public int getViewVerticalDragRange(View child) {
return getMeasuredHeight()-child.getMeasuredHeight();
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
if(releasedChild==autoBackView){
mDragger.settleCapturedViewAt(mAutoBackOriginPos.x,mAutoBackOriginPos.y);
invalidate();
}
}
});
}
@Override
public void computeScroll() {
// super.computeScroll();
if(mDragger!=null){
if(mDragger.continueSettling(true)){
invalidate();
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(mDragger!=null){
mDragger.processTouchEvent(event);
}
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mDragger!=null?mDragger.shouldInterceptTouchEvent(ev):super.onInterceptTouchEvent(ev);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
mWidth=getWidth();
mHeight=getHeight();
}
}
XML布局文件
<?xml version="1.0" encoding="utf-8"?>
<com.example.xunfuqiu.VDHLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rl_content"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Hello World!" />
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@mipmap/ic_launcher"
android:layout_centerInParent="true"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入文字。。。"
android:textSize="16sp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="20dp"
/>
</com.example.xunfuqiu.VDHLayout>
MainActivty使用
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private VDHLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = ((VDHLayout) this.findViewById(R.id.rl_content));
ImageView iv=new ImageView(this);
RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
iv.setImageResource(R.mipmap.ic_launcher);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.CENTER_VERTICAL);
iv.setLayoutParams(params);
iv.bringToFront();
layout.addBackView(iv);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "00000000000000", Toast.LENGTH_SHORT).show();
}
});
}
}