自定义View之九宫格Item位置自由交换

前言

这个是年前就写好的demo,现在是整理后放了上来,至于我为什么要写这个,因为要写别的了:)
标题的描述可能不够准确,所以具体的样式还是看效果图。
关于这个效果其实是可以扩展成我想玩的一个游戏的,类似淘宝里的猫咪咖啡馆,等我周日补上来。

效果图

image

思路 1

  1. 有两个list,一个位置固定的,另一个位置不固定的(即手指滑动哪一个就更改哪一个的坐标)。

  2. 在手势的ACTION_MOVE的时候,位置是及时更新的,但是不允许越过手机屏幕的边界。
    2.1 判断这个item是否处于已经从Square中拖动的状态,如果是,直接更新位置,如果不是则走2.2的逻辑。
    2.2 根据手指实际对应的位置找出不固定位置的列表对应的item,并及时更新位置信息。

  3. 在手势为ACTION_UP的时候,判断是否是靠近了最近的一个Square,如果是,直接让这个item进入到Square里。如果该Square内的item不为空,则交换两个item的位置。

  4. 尺寸相关的适配。

思路 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值