前言
这个是年前就写好的demo,现在是整理后放了上来,至于我为什么要写这个,因为要写别的了:)
标题的描述可能不够准确,所以具体的样式还是看效果图。
关于这个效果其实是可以扩展成我想玩的一个游戏的,类似淘宝里的猫咪咖啡馆,等我周日补上来。
效果图
思路 1
-
有两个list,一个位置固定的,另一个位置不固定的(即手指滑动哪一个就更改哪一个的坐标)。
-
在手势的ACTION_MOVE的时候,位置是及时更新的,但是不允许越过手机屏幕的边界。
2.1 判断这个item是否处于已经从Square中拖动的状态,如果是,直接更新位置,如果不是则走2.2的逻辑。
2.2 根据手指实际对应的位置找出不固定位置的列表对应的item,并及时更新位置信息。 -
在手势为ACTION_UP的时候,判断是否是靠近了最近的一个Square,如果是,直接让这个item进入到Square里。如果该Square内的item不为空,则交换两个item的位置。
-
尺寸相关的适配。
思路 2 —2019/02/18更新
我又思考了一下,可以考虑只做一个list,
但是在拖动item的坐标是一个单独的item对象,这样在拖动item值不为空的情况下,
绘制list的item的坐标的时候,跳过拖动的item,(拖动的item需要单独绘制)
因为最终的item的坐标终归会回到初始值.所以最后只需要在up的时候,替换list中的两个item的坐标即可.
代码
ExchangeCirclesView.java
public class ExchangeCirclesView extends View {
private final int radiusCircle2 = 150; //直径
private Paint paint;
private float circleX = radiusCircle2, circleY = radiusCircle2;
private int[] arrays;
private int width;
private List<Point> circlePointList = new ArrayList<>(); //圆圈的实际PointList,坐标位置可变
private List<Point> finalSquarePointList = new ArrayList<>(); //固定Square区域的Point,坐标位置不可变
private float heightPadding;
private int height;
private Point touchPoint; //实际触摸的那个Point(圆圈)
private int textColor;
public ExchangeCirclesView(Context context) {
this(context, null);
}
public ExchangeCirclesView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ExchangeCirclesView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
}
private void initPaint() {
int textSize = radiusCircle2 / 5;
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(1);
paint.setTextSize(textSize * 3 / 2);
paint.setTextAlign(Paint.Align.CENTER);
touchPoint = new Point(-1, -1);
textColor = Color.WHITE;
arrays = new int[]{
Color.MAGENTA, Color.GREEN, Color.YELLOW, Color.RED, Color.BLUE, Color.GRAY, Color.DKGRAY,
ContextCompat.getColor(getContext(), R.color.colorPrimaryDark), Color.LTGRAY, Color.CYAN};
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super