Android手摸手实现一个画板功能(一)——View的拖拽

一、概述

  从之前项目中抽取出来的一个“画板”功能模块,就是可以在一个空白布局上,添加不同的元素,实现自由组合,暂时没想到啥好名字,姑且叫它“画板”吧。
  主要实现了View的拖拽、缩放、旋转、复制、View导出图片、文本编辑、磁力连接线、上一步和下一步状态备忘等功能。该项目主要涉及的知识点:View的事件分发、手势多点触控、View坐标系、备忘录设计模式等。
  由于该项目是为特定pad机型定制项目,未做其他机型兼容性处理,但是这并不影响本文对其原理的讲解,建议使用1200 x 1920平板模拟器或真机运行工程以获得最佳体验。
  无图言屌?上图:

效果图.gif

二、解析

2.1 侧边栏长按拖拽到画布

  思路大概是酱紫:
  第一步,为侧边栏的每个Imageview设置OnLongClickListener、OnTouchListener;
  第二步,长按时生成一个新的Imageview对象,根据当前长按的Imageview的id,设置相应的ImageResource,并添加到画布中;
  第三步,为刚刚生成的Imageview对象设置OnTouchListener,在onTouch方法中,不断的更新ImageView的xy坐标,从而实现view的拖拽。
  看代码:

2.1.1 setOnLongClickListener()、setOnTouchListener()

        ImageView allImageView = (ImageView) findViewById(R.id.allIcon);
        allImageView.setOnTouchListener(mTouchListener);
        allImageView.setOnLongClickListener(mLongClickListener);

        ImageView smileImageView = (ImageView) findViewById(R.id.smileIcon);
        smileImageView.setOnTouchListener(mTouchListener);
        smileImageView.setOnLongClickListener(mLongClickListener);

        ImageView jewelryImageView = (ImageView) findViewById(R.id.jewelryIcon);
        jewelryImageView.setOnTouchListener(mTouchListener);
        jewelryImageView.setOnLongClickListener(mLongClickListener);

        ImageView hotImageView = (ImageView) findViewById(R.id.hotIcon);
        hotImageView.setOnTouchListener(mTouchListener);
        hotImageView.setOnLongClickListener(mLongClickListener);

        ImageView lineImageView = (ImageView) findViewById(R.id.lineIcon);
        lineImageView.setOnTouchListener(mTouchListener);
        lineImageView.setOnLongClickListener(mLongClickListener);

        ImageView rect = (ImageView) findViewById(R.id.rectIcon);
        rect.setOnTouchListener(mTouchListener);
        rect.setOnLongClickListener(mLongClickListener);

2.1.2 长按事件处理:

 private View.OnLongClickListener mLongClickListener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            final ImageView imageView = new ImageView(MainActivity.this);
            mCurrentImageView = imageView;
            ViewInfo viewInfo = new ViewInfo(v.getId(), 0);
            viewInfo.type = ViewInfo.TYPE_IMAGEVIEW;
            viewInfo.color = mCurrentColor;
            viewInfo.realId = ++mRealInfoId;
            imageView.setTag(viewInfo);
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            setImageResource(imageView, true);
            int[] location = new int[2];
            v.getLocationOnScreen(location);
            locationX = location[0];
            l
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值