我们平时在开发中,有时候需要在点击控件后有一个缩放效果,当然,有些朋友会讲这很简单啊,在资源文件中给两个不同的背景,用selecter作为切换,可以达到需要的效果,或者用动画,这也很好的实现需求。但是,今天我们要做的这个点击缩放控件不单单是缩放那么简单,请看效果图!
首先,要实现以上效果,我们要自定义View继承Imageview,通过Imageview的Matrix来设置图片的缩放,旋转,平移等等。开始初始化参数:
/**
* 是否执行中
*/
private boolean onAnimation = true;
/**
* 旋转角度
*/
private int rotateDegree = 10;
private boolean isFirst = true;
/**
* 比例
*/
private float minScale = 0.95f;
/**
* 控件宽度
*/
private int vWidth;
/**
* 控件高度
*/
private int vHeight;
private boolean isFinish = true, isActionMove = false, isScale = false;
/**
* 相机api
*/
private Camera camera;
boolean XbigY = false;
float RolateX = 0;
float RolateY = 0;
这里要说明一下,Camera类在这里,主要用于,图片的处理。好 了,接下来初始化构造方法,同时Camera也创建出来。
public MyImageView(Context context) {
super(context);
camera = new Camera();
}
public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
camera = new Camera();
}
这样我们就可以开始在ondraw()里面操作各种数据了,下面重写ondraw()并在里面初始化,这里有一个判断是否是第一次展示,用了isFirst来做标志位,如果第一次就初始化参数,如果不是就 不再初始化参数了。当然这个直接写在构造方法里面也可以。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (isFirst) {
isFirst = false;
//初始化
init();
}
//为画布设置抗锯齿
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG));
}
/**
* 初始化
*/
public void init() {
vWidth = getWidth() - getPaddingLeft() - getPaddingRight();
vHeight = getHeight() - getPaddingTop() - getPaddingBottom();
Drawable drawable = getDrawable();
BitmapDrawable bd = (BitmapDrawable) drawable;
/**画笔设置抗锯齿
*/
bd.setAntiAlias(true);
}
上面的init()方法中getDrawable()方法作用就是得到Imageview的显示图片。这下我们就应该开始处理点击事件了。重写OnTuchEvent()在里面分别处理Down,Move,Up事件。
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (!onAnimation)
return true;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
float X = event.getX();
float Y = event.getY();
RolateX = vWidth / 2 - X;
RolateY = vHeight / 2 - Y;
XbigY = Math.abs(RolateX) > Math.abs(RolateY) ? true : false;
//这里判断缩放区域
isScale = X > vWidth / 3 && X < vWidth * 2 / 3 && Y > vHeight / 3 && Y < vHeight * 2 / 3;
isScale = true;
isActionMove = false;
if (isScale) {
handler.sendEmptyMessage(1);
} else {
rolateHandler.sendEmptyMessage(1);
}
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
if (x > vWidth || y > vHeight || x < 0 || y < 0) {
isActionMove = true;
} else {
isActionMove = false;
}
break;
case MotionEvent.ACTION_UP:
if (isScale) {
handler.sendEmptyMessage(6);
} else {
rolateHandler.sendEmptyMessage(6);
}
break;
}
return true;
}
当检测到点击区域位于View的位置后,就通过handler发送消息,在handler里面处理,缩放操作。在这里我们分为两个效果,1.点击View边缘,所在边缘缩放效果。2.点击View中心四周缩放。这样rolateHandler用于边缘缩放,handler用于四周缩放。