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