2015-03-27 22:10

项目开发中需要开发漂亮的界面,其中一些界面需要花边

例如:

如果切图切整一条,那么他只适用于该分辨率的手机,如果放到其它手机上或放到平板上,他就会被拉长,用.9图也是一样会被拉长,那么该怎么办呢?

对于这种情况,我们只好切出波浪线重复的那一部分:

img_wave.png

拿到这部分之后,我们开始自定义一个view,用view的ondraw绘制横向绘制这个重复部分、

绘制之前,我们需要将img_wave放大到view得高度:

[java]  view plain copy print ?
  1. float scale = getMeasuredHeight()*1f/bitmap.getHeight();
  2. float width = bitmap.getWidth()*1f*scale;

同时也需要计算绘制的个数,让绘制的效果达到最好:

[java]  view plain copy print ?
  1. waveCount = (int)(getMeasuredWidth()*1f/bitmap.getWidth())+1;

上面+1的原因是因为让它多出一个,足以铺满,

+1个之后宽度超出view宽度,再重新计算img_wavw的绘制宽度及缩放比例:

[java]  view plain copy print ?
  1. waveWidth = width - ((width*waveCount-getMeasuredWidth())/waveCount);
  2. waveScale = waveWidth*1f/bitmap.getWidth();

最后,横向绘制波浪:

[java]  view plain copy print ?
  1. matrix.setScale(waveScale, waveScale);
  2. for (int i = 0; i < waveCount; i++) {
  3. canvas.drawBitmap(bitmap_wave.get(), matrix, paint);
  4. matrix.postTranslate(waveWidth, 0);
  5. }

最后效果图如下:

是不是很棒?最后贴出代码,希望能帮到大家:

[html]  view plain copy print ?
  1. /**
  2. * 无缝花边
  3. * @author touch_ping
  4. *
  5. */
  6. public class WaveLineView extends View {
  7. private final static int waveRes = R.drawable.img_wave;
  8. private static SoftReference<Bitmap> bitmap_wave;// 背景
  9. private Context mcontext;
  10. private static Paint paint;
  11. private static Matrix matrix;
  12. private static float waveWidth;
  13. private static float waveScale;
  14. private static int waveCount;
  15. public WaveLineView(Context context) {
  16. super(context);
  17. init(context);
  18. }
  19. public WaveLineView(Context context, AttributeSet attrs) {
  20. super(context, attrs, 0);
  21. init(context);
  22. }
  23. private void init (Context context) {
  24. mcontext = context;
  25. }
  26. @Override
  27. protected void onDraw(Canvas canvas) {
  28. super.onDraw(canvas);
  29. if (paint==null) {
  30. paint = new Paint();
  31. }
  32. if (matrix==null) {
  33. matrix = new Matrix();
  34. }
  35. if (bitmap_wave==null || bitmap_wave.get()==null) {
  36. // 从资源文件中生成位图
  37. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), waveRes);
  38. float scale = getMeasuredHeight()*1f/bitmap.getHeight();
  39. float width = bitmap.getWidth()*1f*scale;
  40. waveCount = (int)(getMeasuredWidth()*1f/width)+1;
  41. waveWidth = width - ((width*waveCount-getMeasuredWidth())/waveCount);
  42. waveScale = waveWidth*1f/bitmap.getWidth();
  43. bitmap_wave = new SoftReference<Bitmap>(bitmap);
  44. }
  45. matrix.setScale(waveScale, waveScale);
  46. for (int i = 0; i < waveCount; i++) {
  47. canvas.drawBitmap(bitmap_wave.get(), matrix, paint);
  48. matrix.postTranslate(waveWidth, 0);
  49. }
  50. }
  51. }

android绘制花边view-WaveLineView相关推荐

  1. Android刷新机制-View绘制原理

    Android刷新机制-View绘制原理 Android刷新机制-SurfaceFlinger原理 Android刷新机制-Choreographer原理 一.概述 本文将从startActivity ...

  2. android绘制view的过程

    1 android绘制view的过程简单描述  简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw):             下面看看每一步的动作到底 ...

  3. Android面试,View绘制流程以及invalidate()等相关方法分析

    整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为 根据之前设置的状态,判断是否需要重新计算视图大小(measu ...

  4. android 自定义viewgroup onmeasure,Android进阶——自定义View之View的绘制流程及实现onMeasure完全攻略...

    引言 Android实际项目开发中,自定义View不可或缺,而作为自定义View的一种重要实现方式--继承View重绘尤其重要,前面很多文章基本总结了继承View的基本流程:自定义属性和继承View重 ...

  5. Android绘制竖直虚线完美解决方案—自定义View

    Android绘制竖直虚线完美解决方案-自定义View 开发中我们经常会遇到绘制虚线的需求,一般我们使用一个drawable文件即可实现,下面我会先列举常规drawable文件的实现方式. 使用dra ...

  6. Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件...

    UI的描述 对于Android应用程序中,所有用户界面元素都是由View和ViewGroup对象构建的.View是绘制在屏幕上能与用户进行交互的一个对象.而对于ViewGroup来说,则是一个用于存放 ...

  7. Android绘制流程

    一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL. Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...

  8. android绘制高亮区域,实现高亮某行的RecyclerView效果

    最终效果 全部代码:github 方式有二 组合控件,RecyclerView + View 自定义RecyclerView 1中只需要控制View,但是不好封装. 2中需要重写RecyclerVie ...

  9. 精通android布局,Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件...

    标题图 UI的描述 对于Android应用程序中,所有用户界面元素都是由View和ViewGroup对象构建的.View是绘制在屏幕上能与用户进行交互的一个对象.而对于ViewGroup来说,则是一个 ...

最新文章

  1. Job for docker.service failed because the control process exited with error code. See systemctl sta
  2. ISME:南土所梁玉婷组-不同气候条件下微生物代谢及残体介导施肥对土壤有机碳的影响...
  3. js 函数调用顺序研究
  4. 硬盘和显卡的访问与控制(二)——《x86汇编语言:从实模式到保护模式》读书笔记02
  5. HACMP 认证学习系列,第 2 部分:计划与设计
  6. php 中getall,PHP getallheaders无法获取自定义头(headers)的问题
  7. 关于perl中DBD for Oracle的安装
  8. crontab定时任务运行
  9. ICCV2021 workshop 多视角残缺点云的补全与配准
  10. 高级PHP应用程序漏洞审核技术
  11. MySQL无法读表错误的解决方法(MySQL 1018 error)
  12. office word 2007快捷键大全
  13. Linkage 使用方法总结
  14. BZOJ3714: [PA2014]Kuglarz 最小生成树
  15. 【061】百度迁徙-用地图大数据演绎国人的迁徙史诗
  16. CSGO中最新骗术!新老玩家须知-CSGO防骗指南
  17. oracle查找用户名和密码忘记了,Oracle忘记用户名和密码的解决方案
  18. Python 愤怒的小鸟代码实现:物理引擎pymunk使用
  19. Makefile中的wildcard用法
  20. Bibtex 参考文献样式

热门文章

  1. laravel 实现app支付宝退款
  2. python中rgb颜色_自定义RGB颜色与Python诅咒
  3. eclipse java转class_Eclipse中的Java项目:无法解析java.lang.Object类型。 它是从所需的.class文件间接引用的...
  4. 【Unity3D实战】零基础一步一步教你制作酷跑类游戏(1)
  5. 2019总结,2020寄望(没有干货,纯属闲聊)
  6. 内网穿透配置(FRP)
  7. 微信小程序学习第8天——自定义组件的数据监听器Observer小案例
  8. Android深度探索--HAL与驱动开发----第五章读书笔记
  9. 【懒懒的Python学习笔记九】
  10. php 数值转时间格式,php数值转换时间及时间转换数值用法示例