转载请注明出处: http://blog.csdn.net/iwanghang/
觉得博文有用,请点赞,请评论,请关注,谢谢!~

继续上一篇博文,移动的View,我们来一下自定义View如何缩放:

老规矩,先上GIF动态图,看个效果,如果符合你的项目或者确定你要了解的内容,再往下看吧:

MainActivity.java:

package com.iwanghang.mannequindemo;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;public class MainActivity extends Activity implements View.OnClickListener{private MannequinView mannequinView;private int x = 0;private int y = 0;private float z = 1;private int distance = 20;private float multiple = 0.5f;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mannequinView = (MannequinView) findViewById(R.id.mannequinView);findViewById(R.id.up).setOnClickListener(this);findViewById(R.id.down).setOnClickListener(this);findViewById(R.id.left).setOnClickListener(this);findViewById(R.id.right).setOnClickListener(this);findViewById(R.id.big).setOnClickListener(this);findViewById(R.id.small).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.up:y-=distance;mannequinView.setXY(x,y);Log.v("ceshi","setXY---up");break;case R.id.down:y+=distance;mannequinView.setXY(x,y);Log.v("ceshi","setXY---down");break;case R.id.left:x-=distance;mannequinView.setXY(x,y);Log.v("ceshi","setXY---left");break;case R.id.right:x+=distance;mannequinView.setXY(x,y);Log.v("ceshi","setXY---right");break;case R.id.big:z+=multiple;mannequinView.setZone(z);Log.v("ceshi","set---big");break;case R.id.small:z-=multiple;mannequinView.setZone(z);Log.v("ceshi","set---small");break;}}
}

MannequinView.java:

package com.iwanghang.mannequindemo;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;public class MannequinView extends View {private int x = 0;private int y = 0;private float z = 1;public MannequinView(Context context, AttributeSet attrs) {super(context, attrs);}public MannequinView(MainActivity mainActivity) {super(mainActivity);}// 当Android系统需要绘制一个View对象时,就会调用该对象的onDraw@Overrideprotected void onDraw(Canvas canvas) {Paint paint = new Paint();paint.setColor(Color.GRAY);paint.setStrokeWidth((float) 3.0); // 线宽paint.setAntiAlias(true); // 抗锯齿//canvas.drawLine(0,0,200,200,paint);String[] pointArray;// 头 第一条线String point1 = "523,169";String point2 = "540,157";String point3 = "562,152";String point4 = "584,158";String point5 = "600,171";pointArray = new String[]{point1,point2,point3,point4,point5};drawMyLines(pointArray,canvas,paint);// 头 第二条线String point6 = "512,187";String point7 = "523,169";String point8 = "540,162";String point9 = "562,158";String point10 = "584,162";String point11 = "600,171";String point12 = "611,187";pointArray = new String[]{point6,point7,point8,point9,point10,point11,point12};drawMyLines(pointArray,canvas,paint);// 头 第三条横线String point13 = "509,207";String point14 = "509,193";String point15 = "512,187";String point16 = "520,181";String point17 = "538,174";String point18 = "562,171";String point19 = "586,174";String point20 = "603,181";String point21 = "611,187";String point22 = "613,192";String point23 = "615,211";pointArray = new String[]{point13,point14,point15,point16,point17,point18,point19,point20,point21,point22,point23};drawMyLines(pointArray,canvas,paint);// 头 第四条横线String point24 = "509,248";String point25 = "506,210";String point26 = "518,199";String point27 = "535,192";String point28 = "561,190";String point29 = "589,192";String point30 = "607,200";String point301 = "615,211";String point31 = "618,216";String point32 = "615,239";pointArray = new String[]{point24,point25,point26,point27,point28,point29,point30,point301,point31,point32};drawMyLines(pointArray,canvas,paint);// 头 第五条横线String point33 = "514,261";String point34 = "509,248";String point35 = "510,229";String point36 = "518,221";String point37 = "535,214";String point38 = "562,213";String point39 = "589,214";String point40 = "605,220";String point41 = "613,228";String point42 = "615,239";String point43 = "609,262";pointArray = new String[]{point33,point34,point35,point36,point37,point38,point39,point40,point41,point42,point43};drawMyLines(pointArray,canvas,paint);// 头 第六条横线String point44 = "525,292";String point45 = "514,261";String point46 = "523,249";String point47 = "539,246";String point48 = "562,246";String point49 = "585,246";String point50 = "600,249";String point51 = "609,262";String point52 = "599,293";pointArray = new String[]{point44,point45,point46,point47,point48,point49,point50,point51,point52};drawMyLines(pointArray,canvas,paint);// 头 第七条横线 - 起点终点与第一条线相同String point53 = "523,169";String point54 = "521,181";String point55 = "518,199";String point56 = "518,221";String point57 = "523,249";String point58 = "533,274";String point59 = "562,287";String point60 = "592,274";String point61 = "600,249";String point62 = "606,221";String point63 = "607,200";String point64 = "603,180";String point65 = "600,171";pointArray = new String[]{point53,point54,point55,point56,point57,point58,point59,point60,point61,point62,point63,point64,point65};drawMyLines(pointArray,canvas,paint);// 头 第八条横线 - 起点终点与第三条线相同String point66 = "509,207";String point67 = "510,229";String point68 = "517,257";String point69 = "529,283";String point70 = "545,295";String point71 = "562,299";String point72 = "580,295";String point73 = "594,283";String point74 = "607,257";String point75 = "613,228";String point76 = "615,211";pointArray = new String[]{point66,point67,point68,point69,point70,point71,point72,point73,point74,point75,point76};drawMyLines(pointArray,canvas,paint);// 头 第九条横线 - 起点终点与第六条线相同String point77 = "525,292";String point78 = "545,306";String point79 = "562,309";String point80 = "580,306";String point81 = "599,293";pointArray = new String[]{point77,point78,point79,point80,point81};drawMyLines(pointArray,canvas,paint);// 头 第10条横线 - 第七条的点6 第六条的起点String point82 = "533,274";String point83 = "525,292";pointArray = new String[]{point82,point83};drawMyLines(pointArray,canvas,paint);// 头 第11条横线 - 第七条的点8 第八条的点8 第六条的终点String point84 = "592,274";String point85 = "594,283";String point86 = "599,293";pointArray = new String[]{point84,point85,point86};drawMyLines(pointArray,canvas,paint);super.onDraw(canvas);}private void drawMyLines(String[] pointArray, Canvas canvas, Paint paint) {for(int i=0;i<pointArray.length;i++){if (i+1<pointArray.length){drawMyLine(pointArray[i],pointArray[i+1],canvas,paint);}}}private void drawMyLine(String point1, String point2, Canvas canvas, Paint paint) {String[] point = (point1 + "," + point2).split(",");
//        canvas.drawLine(
//                x + Float.valueOf(point[0]),
//                y + Float.valueOf(point[1]),
//                x + Float.valueOf(point[2]),
//                y + Float.valueOf(point[3]),paint);Log.v("ceshi", String.valueOf((y + Float.valueOf(point[1])) * z) + " ---" + z);if (z > 1.0){Log.v("ceshi", "z > 1.0");canvas.drawLine((x + Float.valueOf(point[0])) * z - (z - 1) * 523,(y + Float.valueOf(point[1])) * z - (z - 1) * 169,(x + Float.valueOf(point[2])) * z - (z - 1) * 523,(y + Float.valueOf(point[3])) * z - (z - 1) * 169, paint);}else {canvas.drawLine((x + Float.valueOf(point[0])) * z,(y + Float.valueOf(point[1])) * z,(x + Float.valueOf(point[2])) * z,(y + Float.valueOf(point[3])) * z,paint);}}// 移动public void setXY(int x1, int y1) {x = x1;y = y1;invalidate(); // onDraw()}// 缩放public void setZone(float z1) {z = z1;invalidate(); // onDraw()}
}

activity_main.xml:

<LinearLayoutandroid:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.iwanghang.mannequindemo.MannequinViewandroid:id="@+id/mannequinView"android:layout_weight="1"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:layout_weight="7"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/big"android:text="+"android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/small"android:text="-"android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout><LinearLayoutandroid:layout_weight="7"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/up"android:text="↑"android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/down"android:text="↓"android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/left"android:text="←"android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/right"android:text="→"android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>
</LinearLayout>

转载请注明出处: http://blog.csdn.net/iwanghang/

欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式

微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com

觉得博文有用,请点赞,请评论,请关注,谢谢!~

Android开发-自定义View-AndroidStudio(二十八)缩放的View相关推荐

  1. Android开发笔记(一百二十八)手机制式适配

    查看运营商与网络类型 虽然现在4G网络很普及了,但是我国幅员辽阔,4G信号在某些地方接收不良,手机连接很容易掉到3G甚至2G网络.为了让用户在低速环境也能使用App的基础功能,而不至于还在老牛破车地缓 ...

  2. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

  3. Android开发笔记(一百二十二)循环器视图RecyclerView

    RecyclerView RecyclerView是Android在support-v7库中新推出控件,中文别名为循环器视图,它的功能非常强大,可分别实现ListView.GridView,以及瀑布流 ...

  4. 关闭数字健康 android 魅族,数字体验 篇二十八:精雕细刻,只为给魅友更好的选择,魅族16s Pro体验分享...

    数字体验 篇二十八:精雕细刻,只为给魅友更好的选择,魅族16s Pro体验分享 2019-09-06 17:31:22 14点赞 10收藏 15评论 当我还一直在称赞魅族16s所拥有的舒适手感表现时, ...

  5. Android开发笔记(一百二十四)自定义相册

    画廊Gallery Gallery是一个早期的画廊控件,左右滑动手势可展示内嵌的图片列表,类似于一个平面的万花筒.虽然Android现在将Gallery标记为Deprecation(表示已废弃),建议 ...

  6. Android开发笔记(一百一十八)自定义悬浮窗

    WindowManager 在前面< Android开发笔记(六十六)自定义对话框>中,我们提到每个页面都是一个Window窗口,许多的Window对象需要一个管家来打理,这个管家我们称之 ...

  7. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

  8. Android开发笔记(一百四十八)自定义输入法软键盘

    手机上输入文字,都是通过系统自带的软键盘,这个软键盘可以是Android自带的,也可以是第三方软键盘如搜狗输入法.多数情况下面,系统自带的软键盘已经够用了,可是总有少数情况,系统软键盘无法满足开发者的 ...

  9. Android开发笔记(一百二十九)使用变换图形

    裁剪图形ClipDrawable ClipDrawable可设置图形的裁剪幅度,它的构造函数除了指定来源图形之外,还可以指定图形的裁剪方式(从开始裁剪还是从中间裁剪还是从末尾裁剪),以及裁剪方向(水平 ...

最新文章

  1. torch转onnx错误 exit code -1073741819
  2. python创建一个txt文件-python新建txt文件,并逐行写入数据
  3. 20、Power Query-数据合并、拆分
  4. java applet 输出多行_java学习笔记-输入输出、Applet和多线程开发
  5. ADVA收购Overture 扩张NFV产品线
  6. Python之30秒就能学会的漂亮短程序代码
  7. 脚本录制软件python 按键精灵 tc_喜讯。tc也能录脚本了!录制鼠标键盘,tc脚本录制工具!!...
  8. 片袖原型制图_袖原型一片袖打版干货
  9. 【Axure原型分享】会议管理原型模板
  10. 数据分析--数据预处理
  11. 用计算机制作演示文稿教案博客,信息技术:《制作演示文稿的一般过程》教案...
  12. web前端期末大作业 html+css家乡旅游主题网页设计 湖北武汉家乡介绍网页设计实例
  13. 深度学习图像处理目标检测图像分割计算机视觉 10--通用场景图像分割
  14. 996M11鹅厂这些互联网行业“黑话”,你知多少?
  15. ubuntu 打印git邮箱_win 10配置Ubuntu子系统—可以考虑放弃VMware了
  16. Python基础Pro | (17) 电子邮件
  17. 华为模拟器三个路由器全网互通
  18. 【设计模式】单例模式是什么?如何实现单例模式?单例模式常见问题?
  19. 遇到bug的解决办法,测试再也不背锅了
  20. 概率论的几种常考分布总结

热门文章

  1. 常见摄像头接口USB、DVP、MIPI接口的对比
  2. locust获取查询关键字-查询性能脚本
  3. Python中文文本分析时遇到的编码问题小结
  4. 基于睿思BI-开源商业智能系统实现数据快速可视化
  5. 支付宝小程序灰度测试、版本回滚能力新上线
  6. 球球大作战c语言源代码,《球球大作战》源码解析:移动算法
  7. 基于安卓studio的天气预报APP
  8. 智能ai深度学习技术_人工智能深度学习与医学
  9. 图像处理学习笔记01:matlab图像操作基础
  10. 考证pop海报电脑设计