- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android中利用matrix 控制图片的旋转、缩放、移动由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文主要讲解利用android中matrix控制图形的旋转缩放移动,具体参见一下代码:
复制代码 代码如下
/** * 使用矩阵控制图片移动、缩放、旋转 */ public class commonimgeffectview extends view { private context context ; private bitmap mainbmp , controlbmp ; private int mainbmpwidth , mainbmpheight , controlbmpwidth , controlbmpheight ; private matrix matrix ; private float [] srcps , dstps ; private rectf srcrect , dstrect ; private paint paint ,paintrect , paintframe; private float deltax = 0, deltay = 0; //位移值 private float scalevalue = 1; //缩放值 private point lastpoint ; private point prepivot , lastpivot; private float predegree , lastdegree ; private short currentselectedpointindex; //当前操作点击点 private point symmetricpoint = new point(); //当前操作点对称点 /** * 图片操作类型 */ public static final int oper_default = -1; //默认 public static final int oper_translate = 0; //移动 public static final int oper_scale = 1; //缩放 public static final int oper_rotate = 2; //旋转 public static final int oper_selected = 3; //选择 public int lastoper = oper_default; /* 图片控制点 * 0---1---2 * | | * 7 8 3 * | | * 6---5---4 */ public static final int ctr_none = -1; public static final int ctr_left_top = 0; public static final int ctr_mid_top = 1; public static final int ctr_right_top = 2; public static final int ctr_right_mid = 3; public static final int ctr_right_bottom = 4; public static final int ctr_mid_bottom = 5; public static final int ctr_left_bottom = 6; public static final int ctr_left_mid = 7; public static final int ctr_mid_mid = 8; public int current_ctr = ctr_none; public commonimgeffectview(context context){ super(context); this.context = context ; } public commonimgeffectview(context context, attributeset attrs) { super(context, attrs); this.context = context ; initdata(); } /** * 初始化数据 * @author 张进 */ private void initdata(){ mainbmp = bitmapfactory.decoderesource(this.context.getresources(), r.drawable.flower); controlbmp = bitmapfactory.decoderesource(this.context.getresources(), r.drawable.control); mainbmpwidth = mainbmp.getwidth(); mainbmpheight = mainbmp.getheight(); controlbmpwidth = controlbmp.getwidth(); controlbmpheight = controlbmp.getheight(); srcps = new float[]{ 0,0, mainbmpwidth/2,0, mainbmpwidth,0, mainbmpwidth,mainbmpheight/2, mainbmpwidth,mainbmpheight, mainbmpwidth/2,mainbmpheight, 0,mainbmpheight, 0,mainbmpheight/2, mainbmpwidth/2,mainbmpheight/2 }; dstps = srcps.clone(); srcrect = new rectf(0, 0, mainbmpwidth, mainbmpheight); dstrect = new rectf(); matrix = new matrix(); prepivot = new point(mainbmpwidth/2, mainbmpheight/2); lastpivot = new point(mainbmpwidth/2, mainbmpheight/2); lastpoint = new point(0,0); paint = new paint(); paintrect = new paint(); paintrect.setcolor(color.red); paintrect.setalpha(100); paintrect.setantialias(true); paintframe = new paint(); paintframe.setcolor(color.green); paintframe.setantialias(true); setmatrix(oper_default); } /** * 矩阵变换,达到图形平移的目的 * @author 张进 */ private void setmatrix(int operationtype){ switch (operationtype) { case oper_translate: matrix.posttranslate(deltax , deltay); break; case oper_scale: matrix.postscale(scalevalue, scalevalue, symmetricpoint.x, symmetricpoint.y); break; case oper_rotate: matrix.postrotate(predegree - lastdegree, dstps[ctr_mid_mid * 2], dstps[ctr_mid_mid * 2 + 1]); break; } matrix.mappoints(dstps, srcps); matrix.maprect(dstrect, srcrect); } private boolean isonpic(int x , int y){ if(dstrect.contains(x, y)){ return true; }else return false; } private int getoperationtype(motionevent event){ int evx = (int)event.getx(); int evy = (int)event.gety(); int curoper = lastoper; switch(event.getaction()) { case motionevent.action_down: current_ctr = isoncp(evx, evy); log.i("img", "current_ctr is "+current_ctr); if(current_ctr != ctr_none || isonpic(evx, evy)){ curoper = oper_selected; } break; case motionevent.action_move: if(current_ctr > ctr_none && current_ctr < ctr_mid_mid ){ curoper = oper_scale; }else if(current_ctr == ctr_mid_mid ){ curoper = oper_rotate; }else if(lastoper == oper_selected){ curoper = oper_translate; } break; case motionevent.action_up: curoper = oper_selected; break; default: break; } log.d("img", "curoper is "+curoper); return curoper; } /** * 判断点所在的控制点 * @param evx * @param evy * @return */ private int isoncp(int evx, int evy) { rect rect = new rect(evx-controlbmpwidth/2,evy-controlbmpheight/2,evx+controlbmpwidth/2,evy+controlbmpheight/2); int res = 0 ; for (int i = 0; i < dstps.length; i+=2) { if(rect.contains((int)dstps[i], (int)dstps[i+1])){ return res ; } ++res ; } return ctr_none; } @override public boolean dispatchtouchevent(motionevent event) { int evx = (int)event.getx(); int evy = (int)event.gety(); int opertype = oper_default; opertype = getoperationtype(event); switch (opertype) { case oper_translate: translate(evx, evy); break; case oper_scale: scale(event); break; case oper_rotate: rotate(event); break; } lastpoint.x = evx; lastpoint.y = evy; lastoper = opertype; invalidate();//重绘 return true; } /** * 移动 * @param evx * @param evy * @author zhang_jin1 */ private void translate(int evx , int evy){ prepivot.x += evx - lastpoint.x; prepivot.y += evy -lastpoint.y; deltax = prepivot.x - lastpivot.x; deltay = prepivot.y - lastpivot.y; lastpivot.x = prepivot.x; lastpivot.y = prepivot.y; setmatrix(oper_translate); //设置矩阵 } /** * 缩放 * 0---1---2 * | | * 7 8 3 * | | * 6---5---4 * @param evx * @param evy */ private void scale(motionevent event) { int pointindex = current_ctr*2 ; float px = dstps[pointindex]; float py = dstps[pointindex+1]; float evx = event.getx(); float evy = event.gety(); float oppositex = 0 ; float oppositey = 0 ; if(current_ctr<4 && current_ctr >= 0){ oppositex = dstps[pointindex+8]; oppositey = dstps[pointindex+9]; }else if(current_ctr >= 4){ oppositex = dstps[pointindex-8]; oppositey = dstps[pointindex-7]; } float temp1 = getdistanceoftwopoints(px,py,oppositex,oppositey); float temp2 = getdistanceoftwopoints(evx,evy,oppositex,oppositey); this.scalevalue = temp2 / temp1 ; symmetricpoint.x = (int) oppositex; symmetricpoint.y = (int)oppositey; log.i("img", "scalevalue is "+scalevalue); setmatrix(oper_scale); } /** * 旋转图片 * 0---1---2 * | | * 7 8 3 * | | * 6---5---4 * @param evx * @param evy */ private void rotate(motionevent event) { if(event.getpointercount() == 2){ predegree = computedegree(new point((int)event.getx(0), (int)event.gety(0)), new point((int)event.getx(1), (int)event.gety(1))); }else{ predegree = computedegree(new point((int)event.getx(), (int)event.gety()), new point((int)dstps[16], (int)dstps[17])); } setmatrix(oper_rotate); lastdegree = predegree; } /** * 计算两点与垂直方向夹角 * @param p1 * @param p2 * @return */ public float computedegree(point p1, point p2){ float tran_x = p1.x - p2.x; float tran_y = p1.y - p2.y; float degree = 0.0f; float angle = (float)(math.asin(tran_x/math.sqrt(tran_x*tran_x + tran_y* tran_y))*180/math.pi); if(!float.isnan(angle)){ if(tran_x >= 0 && tran_y <= 0){//第一象限 degree = angle; }else if(tran_x <= 0 && tran_y <= 0){//第二象限 degree = angle; }else if(tran_x <= 0 && tran_y >= 0){//第三象限 degree = -180 - angle; }else if(tran_x >= 0 && tran_y >= 0){//第四象限 degree = 180 - angle; } } return degree; } /** * 计算两个点之间的距离 * @param p1 * @param p2 * @return */ private float getdistanceoftwopoints(point p1, point p2){ return (float)(math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y))); } private float getdistanceoftwopoints(float x1,float y1,float x2,float y2){ return (float)(math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))); } @override public void ondraw(canvas canvas){ drawbackground(canvas);//绘制背景,以便测试矩形的映射 canvas.drawbitmap(mainbmp, matrix, paint);//绘制主图片 drawframe(canvas);//绘制边框,以便测试点的映射 drawcontrolpoints(canvas);//绘制控制点图片 } private void drawbackground(canvas canvas){ canvas.drawrect(dstrect, paintrect); } private void drawframe(canvas canvas){ canvas.drawline(dstps[0], dstps[1], dstps[4], dstps[5], paintframe); canvas.drawline(dstps[4], dstps[5], dstps[8], dstps[9], paintframe); canvas.drawline(dstps[8], dstps[9], dstps[12], dstps[13], paintframe); canvas.drawline(dstps[0], dstps[1], dstps[12], dstps[13], paintframe); canvas.drawpoint(dstps[16], dstps[17], paintframe); } private void drawcontrolpoints(canvas canvas){ for (int i = 0; i < dstps.length; i+=2) { canvas.drawbitmap(controlbmp, dstps[i]-controlbmpwidth/2, dstps[i+1]-controlbmpheight/2, paint); } } } 。
demo效果:
最后此篇关于Android中利用matrix 控制图片的旋转、缩放、移动的文章就讲到这里了,如果你想了解更多关于Android中利用matrix 控制图片的旋转、缩放、移动的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
只是想知道 Jquery Mobile 是否足够稳定以用于实时生产企业移动应用程序。 有很多 HTML5 框架,因为我们的团队使用 JQuery 已经有一段时间了,我们更愿意使用 Jquery 移动框
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 3 年前。 Improve t
所以我尝试在 JavaScript 中对元素进行拖放。我使用的视频教程在这里; https://www.youtube.com/watch?v=KTlZ4Hs5h80 。我已经按照它的说明进行了编码,
无法在移动 iOS(safari 和 chrome)上自动播放以前缓存的 mp3 音频 我正在 Angular 8 中开发一个应用程序,在该应用程序的一部分中,我试图在对象数组中缓存几个传入的音频 m
Git 基于内容而不是文件,所以我目前理解以下行为,但我想知道是否有特殊选项或 hack 来检测此类事情: git init mkdir -p foo/bar echo "test" foo/a.tx
我正在寻找语义 ui 正确的类来隐藏例如移动 View 中的 DIV。在 Bootstrap 中,我们有“visible-xs”和“hidden-xs”。 但是在语义ui上我只找到了“仅移动网格” 最
我正在使用 ubuntu 和 想要移动或复制大文件。 但是当我与其他人一起使用服务器时,我不想拥有所有内存并使其他进程几乎停止。 那么有没有办法在内存使用受限的情况下移动或复制文件? 最佳答案 如果你
这些指令有什么区别?以 ARM9 处理器为例,它不应该是: ASM: mov r0, 0 C: r0 = 0; ASM: ld r0, 0 C: r0 = 0; ? 我不知道为什么要使用一个或另一个:
我有一个文件夹,其中包含一些随机命名的文件,其中包含我需要的数据。 为了使用数据,我必须将文件移动到另一个文件夹并将文件命名为“file1.xml” 每次移动和重命名文件时,它都会替换目标文件夹中以前
我经常在 IB/Storyboard 中堆叠对象,几乎不可能拖动其他对象后面的对象而不移动前面的对象。无论如何我可以移动已经选择但位于其他对象后面的对象吗?当我尝试移动它时,它总是选择顶部的对象,还是
几个月前,我看到 Safari 7 允许推送通知,它似乎是一个非常有用的工具,除了我看到的每个示例都专注于桌面浏览,而不是移动设备。 Safari 推送通知是否可以在移动设备上运行,如果没有,是否有计
我有一个简单的 View 模型,其中包含修改后的 ObservableCollection使用 SynchronizationContext.Current.Send在 UI 线程上执行对集合的更改。
关于cassandra创建的数据文件和系统文件的位置,我需要移动在“cassandra.yaml”配置文件中设置的“commitlog_directory”、“data_file_directorie
我有这个代码 $(function() { var message = 'Dont forget us'; var original; var txt1 = ' - '; $(wind
我的客户报告说他的网站有一个奇怪的问题。该网站的 URL 是 your-montenegro.me 在 基于 Android 的浏览器 上加载时,页面底部会出现一个奇怪的空白区域。以下是屏幕截图: 华
我有这个 HTML 标记: Express 300 bsf Sign Up 我需要将元素从 DOM 上的一个
我有一个可重新排序的 TableView (UITableView 实例)。尽管我已经实现了 UITableViewDataSource 方法: tableView:moveRowAtIndexPat
我的客户报告说他的网站有一个奇怪的问题。该网站的 URL 是 your-montenegro.me 在 基于 Android 的浏览器 上加载时,页面底部会出现一个奇怪的空白区域。以下是屏幕截图: 华
我需要在拖放或复制/剪切和粘贴(复制与移动)期间获取操作类型。它是一个 Swing 应用程序,并且实现了 TransferHandle。我在操作结束时需要此信息,在 importData 方法中。 对
我编写了一个具有 add 和 get 方法的 SortedIntList 类。 我调用以下四个方法: SortedIntList mySortedIntList = new SortedIntList
我是一名优秀的程序员,十分优秀!