参考自:http://blog.csdn.net/lmj623565791/article/details/46858663
学习Android初期,之前接触了一些UI设计,突发奇想想要做一个简单的足球战术板(自己是个足球爱好者)。
原理很简单,也就是一个令View移动。
参考了网上有很多种方法,我这里是参考鸿洋的文章,利用ViewDragHelper实现View移动的目的。
先看一下效果图:
附上源码:
TacticsBoardLayout.class
package com.example.chen.tacticsboard;
import android.content.Context;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
public class TacticsBoardLayout extends LinearLayout
{
private ViewDragHelper mDragger;
protected void onFinshInflate(){
super.onFinishInflate();
}
public TacticsBoardLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
mDragger = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback()
{
/* 进行拦截,哪些view可以进行drag操作
** return true 代表拦截所有view
*/
@Override
public boolean tryCaptureView(View child, int pointerId)
{
return true;
}
//水平滑动,控制left
@Override
public int clampViewPositionHorizontal(View child, int left, int dx)
{
return left;
}
//垂直滑动,控制top
@Override
public int clampViewPositionVertical(View child, int top, int dy)
{
return top;
}
});
}
// 事件分发
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
return mDragger.shouldInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
mDragger.processTouchEvent(event);
return true;
}
}
布局:activity_main
<?xml version="1.0" encoding="utf-8"?>
<com.example.chen.tacticsboard.TacticsBoardLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:orientation="vertical"
>
<TextView
android:layout_width="45dp"
android:layout_height="45dp"
android:id="@+id/play1"
android:background="@drawable/player"
android:gravity="center"
android:textSize="20dp"
android:text="2"
android:layout_marginLeft="150dp"
android:textColor="#FFFFFF"
android:layout_marginTop="100dp"
/>
<TextView
android:layout_width="45dp"
android:layout_height="45dp"
android:id="@+id/play2"
android:background="@drawable/player"
android:gravity="center"
android:textSize="20dp"
android:text="3"
android:layout_marginLeft="260dp"
android:textColor="#FFFFFF"
android:layout_centerVertical="true"
/>
<TextView
android:layout_width="45dp"
android:layout_height="45dp"
android:id="@+id/play3"
android:background="@drawable/player"
android:gravity="center"
android:textSize="20dp"
android:text="7"
android:textColor="#FFFFFF"
android:layout_marginLeft="55dp"
android:layout_marginTop="25dp"
/>
<TextView
android:layout_width="45dp"
android:layout_height="45dp"
android:id="@+id/play4"
android:background="@drawable/player"
android:gravity="center"
android:textSize="20dp"
android:text="9"
android:textColor="#FFFFFF"
android:layout_marginLeft="190dp"
android:layout_marginTop="35dp"
/>
<TextView
android:id="@+id/gk"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="27dp"
android:background="@drawable/gk"
android:gravity="center"
android:text="1"
android:textColor="#000000"
android:textSize="18dp"
android:layout_marginLeft="160dp"
android:layout_marginTop="100dp"/>
</com.example.chen.tacticsboard.TacticsBoardLayout>
这里就是将子View实现最简单的移动,其中,我们可以通过child来设置移动的对象,以及在 clampViewPositionHorizontal和 clampViewPositionVertical
中,可以写上具体的想法为View移动进行更为详细的定制。