转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50455412

本系列是为新手准备的自定义view练习项目(大牛请无视),相信在学习过程中,想学自定义view又无从下手,不知道做什么。本系列为新手提供了一系列自定义view的简单实例。看过理解之后,自己实现,相信会有很大提高。

公司需要做地图,无奈美工没有给那种泡泡窗口,于是只能自定义view自己画一个。

由于实现比较简单,便想写下来,给新手做一个自定义view的参考,新人学自定义view的时候也可以先拿这个练手。

首先看效果图,就是一般的泡泡窗啦。

那么现在就开始了,分析一下,其实就是一个圆角矩形 加上一个三角。画出来就是了。

首先先创建一个类,继承自View  ,重写他的构造方法,这里为了简便就不加自定义属性了。

   public PopupView(Context context) {this(context,null);}public PopupView(Context context, AttributeSet attrs) {this(context, attrs,0);}public PopupView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}

然后是测量他的大小,为了方便,这里只给出EXACTLY的测量值,AT_MOST的时候大家可以自己给一个初始值,这里就不加了

里面有个mRect,其实就是圆角矩形啦。圆角矩形要比整体的view小一点,这里我直接乘上一个百分比来体现,我给的值是mRectPercent = 0.8;(这个处理方式是十分不好的,是一种错误的方式,这里我不想更正了,因为只有错误才能提高。你可以查看下一篇博客,计算了padding,让矩形处于最中间)。

  @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthSize = MeasureSpec.getSize(widthMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);if(widthMode== MeasureSpec.EXACTLY){mWidth = widthSize; //获取到当前view的宽度mRectWidth = (int) (mWidth * mRectPercent);//计算矩形的大小 这里是直接给的初值为0.8 也就是说矩形是view大小的0.8倍 下同}if(heightMode == MeasureSpec.EXACTLY){mHeight = heightSize;//获取当前view的高度mRectHeight = (int) (mHeight * mRectPercent+0.1);}setMeasuredDimension(mWidth,mHeight);}

测量完成以后接下来就是绘制了,绘制起来也比较简单,关键是计算出关键点的坐标。这里来一张图表示一下

只需要把三角的三个点的坐标计算出来就可以了。至于后面加减的数字,其实就是三角形的高和底边长 也很简单,聪明的你一定一看就懂。

那么就把这些坐标画成图形。

 @Overrideprotected void onDraw(Canvas canvas) {Paint p = new Paint();p.setColor(Color.parseColor("#2C97DE"));p.setStyle(Paint.Style.FILL);canvas.drawRoundRect(new RectF(0,0,mRectWidth,mRectHeight),10,10,p);Path path = new Path();path.moveTo(mRectWidth/2-30,mRectHeight);path.lineTo(mRectWidth/2,mRectHeight+20);path.lineTo(mRectWidth/2+30,mRectHeight);path.close();canvas.drawPath(path,p);super.onDraw(canvas);}

其中圆角矩形是用drawRoundRect方法来绘制的,里面是一个基本的矩形,和圆角的半径

三角形是用path来绘制,首先用moveTo设定起点坐标,最后将两条线连接起来,别忘了close成一个封闭的图形。

这样就大功告成泡泡窗,不用麻烦美工啦!

如果你觉得这个自定义view比较简单可以闭着眼睛写出来,你还可以参考进阶一点点的 自定义圆形百分比,进度条 进行练习,总之自定义view并不难,只要多练,就一定会掌握熟练。

新手自定义view练习实例之(一) 泡泡弹窗相关推荐

  1. 用c语言绘制自定义图形,Android使用自定义View绘图

    使用自定义 View 绘图 实例 MyViewCanvasDemo 自定义一个名为 MyView 的 View 类,并在其 onDraw() 方法中绘制简单的图像,运行效果如图 1 所示. 图 1   ...

  2. Android中的自定义View(一)

    文章收藏的好句子:成功从来不是一蹴而就,而是日积月累的努力叠加的结果. ps:本文是基于 Android API 31 来分析的,文章写的 demo 是用 AndroidStudio 工具来开发的. ...

  3. 以小米时钟为demo学习自定义view过程总结

    首选感谢这位博主的分享,让我等新生有很好的范例学习 http://blog.csdn.net/qq_31715429/article/details/54668668点击打开链接 点击打开链接 点击打 ...

  4. Android 自定义 圆环,Android自定义view实现圆环效果实例代码

    先上效果图,如果大家感觉不错,请参考实现代码. 重要的是如何实现自定义的view效果 (1)创建类,继承view,重写onDraw和onMesure方法 public class CirclePerc ...

  5. Android自定义view详解,使用实例,自定义属性,贝塞尔曲线

    //只会触发执行onDraw方法,只会改变绘制里面的内容,条目的绘制 invalidate(); //只会触发执行onDraw方法,但是可以在子线程中刷新 postInvalidate(); //vi ...

  6. android 自定义view滚动条,Android自定义View实现等级滑动条的实例

    Android自定义View实现等级滑动条的实例 实现效果图: 思路: 首先绘制直线,然后等分直线绘制点: 绘制点的时候把X值存到集合中. 然后绘制背景图片,以及图片上的数字. 点击事件down的时候 ...

  7. android 动态画直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  8. android 动态生成直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  9. android自定义view案例,Android自定义View的实现方法实例详解

    一.自绘控件 下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次.新建一个CounterView继承自View,代码如下所示: 可以看到,首先我们在 ...

最新文章

  1. 利用pandas读写HDF5文件
  2. 最后两天-微生物组-宏基因组分析(线上/线下同时开课,2020最后一期)
  3. “EncoderDecoder: ‘mit_b1 is not in the backbone registry‘“
  4. Android studio 克隆分支
  5. Discuz X1.5 X2.5 X3 UC_KEY Getshell Write PHPCODE into config/config_ucenter.php Via /api/uc.php Vul
  6. 精细化的风险管理,评分的应用策略之道
  7. android自动运行服务,Android开机自启动服务的实现方法
  8. MSSQL常用操作及方法总结
  9. Invest模型中HAbitat quality(生境质量)的计算过程
  10. mongodb删除某个字段
  11. C++一本通题库1015
  12. 中性市场的期权交易策略
  13. 人脸识别门禁为何倍受青睐?
  14. JAVA md5把我气到疯的代码,天哪,神呀,我的C# 啊。
  15. Substance Painter
  16. 互联网最新灰产项目“视频号霸屏”
  17. Outlook2007备份的方法
  18. javascript 面向对象(实现继承的几种方式)
  19. postgreSQL存储过程写法示例
  20. 压感容流 ,冲击电流冲击电压

热门文章

  1. 用python的OCR实现自动拍照搜题--源码
  2. HTML5期末大作业:防锤子手机商城网站设计——防锤子手机商城官网 (1页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作
  3. Android布局帧布局霓虹灯效果实现
  4. 128元起步的5G套餐算贵吗?专家如是说……
  5. Slackware 14.1 安装后记
  6. [UWP]了解模板化控件(9):UI指南
  7. HTML——bgcolor、background、color属性
  8. 基于MBD的BMS电池管理系统应用层软件,策略说明
  9. 【华三交换机开局基础配置】
  10. js对象的直接赋值、浅拷贝与深拷贝