Android通过手势实现的缩放处理实例代码
网络上传言htc的hero-rom支持多点触摸的论证大多源于浏览网页和图片时,能像iphone一样通过手势来控制页面的大小。下面的例子是利用现有的api实现hero浏览图片和网页的缩放功能。
主要原理是ontouchevent事件中的参数motionevent,它有一个getsize()方法。在一个点的时候,该方法永远返回0,而在两个触电的时候,该方法则根据两点相对位置变化而返回不同的值。我们只需计算出两点之间的距离变化,距离的大小表明我们希望目标变化的趋势。而getx()和gety()方法则永远座落在两触点之间,这样趋势和目标我们都有了。剩下的就是对目标根据趋势进行放大或缩小即可。
/**
* ...
*
* @author vlinux
*
*/
public class multitouchtestactivity extends activity {
/** called when the activity is first created. */
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
// setcontentview(r.layout.main);
view view = new multitouchview(this);
setcontentview(view);
}
class multitouchview extends view {
private float x1;
private float y1;
private float x2;
private float y2;
public multitouchview(context context) {
super(context);
// todo auto-generated constructor stub
}
@override
public boolean ontouchevent(motionevent event) {
// todo auto-generated method stub
float size = event.getsize();
int szi = (int) size;
int dxi = szi >> 12;
int dyit = ((1 << 12) - 1);
int dyi = szi & dyit;
displaymetrics metrics = getresources().getdisplaymetrics();
float dx = metrics.widthpixels * dxi / (float) dyit;
float dy = metrics.heightpixels * dyi / (float) dyit;
x1 = event.getx();
y1 = event.gety();
x2 = x1 + dx;
y2 = y1 + dy;
invalidate();
return true;
}
@override
protected void ondraw(canvas canvas) {
// todo auto-generated method stub
super.ondraw(canvas);
float r = (float) math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2)
* (y1 - y2)) / 2;
r = 50 >= r ? 50 : r;
paint paint = new paint();
paint.setcolor(color.blue);
canvas.drawcircle(x1, y1, r, paint);
}
}
}