在Android中画线必须由一个载体,要么是一个控件,要么是一个布局,其实他们都是继承自View,通过自定义控件或布局的方式画线是最常见的。下面的小例子实现了在自定义RelativeLayout中画网格线

自定义控件代码:

package layout.layout.ex;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.RelativeLayout;public class GridRelativeLayout extends RelativeLayout {private Canvas myCanvas;private int horGrid = 100, verGrid = 100;//水平网格和竖直网格private int screenW, screenH;//屏幕宽和高private boolean initOver = false;//初始化标签public GridRelativeLayout(Context context) {super(context);setWillNotDraw(false);}public GridRelativeLayout(Context context, AttributeSet attrs) {super(context, attrs);setWillNotDraw(false);}public GridRelativeLayout(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);setWillNotDraw(false);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);this.myCanvas = canvas;Paint paint = new Paint();paint.setColor(android.graphics.Color.YELLOW);//颜色paint.setStrokeWidth(3);//线宽int verNum = (int)(screenH / verGrid) + 1;int horNum = (int)(screenW / horGrid) + 1;if (initOver) {for (int i = 0; i < verNum; i++) {canvas.drawLine(0, i * verGrid - 1, screenW, i * verGrid - 1,paint);}for (int i = 0; i < horNum; i++) {canvas.drawLine(i * horGrid - 1, 0, i * horGrid - 1, screenH,paint);}}}/**设置网格线参数**/public void setInf(int vergrid, int horgrid, int screenW, int screenH) {this.verGrid = vergrid;this.horGrid = horgrid;this.screenW = screenW;this.screenH = screenH;initOver = true;postInvalidate();}/**擦除网格线**/public void clearLine(){initOver = false;postInvalidate();}
}

主程序代码:

package com.example.test005;import layout.layout.ex.GridRelativeLayout;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class MainActivity extends Activity {
private GridRelativeLayout rl;
private Button btnDraw,btnClear;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rl=(GridRelativeLayout)findViewById(R.id.rl);btnDraw=(Button)findViewById(R.id.button1);btnClear=(Button)findViewById(R.id.button2);btnDraw.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {rl.setInf(100, 100, 1280, 720);//画网格线}});btnClear.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {rl.clearLine();//擦除网格线}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}}

自定义布局RelativeLayout 画网格线相关推荐

  1. ViewGroup1——自定义布局

    平时开发时,系统提供的几个布局基本就能满足我们的需求了.如果系统提供的布局无法满足需求,我们可以扩展ViewGroup类来实现自定义布局控件.先看下ViewGroup的继承图 由上图可知,ViewGr ...

  2. 从自定义TagLayout看自定义布局的一般步骤[手动加精]

    从自定义TagLayout看自定义布局的一般步骤[手动加精] 我们常用的布局有LinearLayout,FrameLayout,RelativeLayout,大多数情况下都能满足我们的需求,但是也有很 ...

  3. 【转】Android AlertDialog自定义布局

    原文网址:https://blog.csdn.net/u010694658/article/details/53022294 由于开发中经常使用弹框,然而系统自带的弹框太局限,也不太美观,经常不能满足 ...

  4. 安卓自定义布局显示流式搜索记录

    安卓自定义布局显示流式搜索记录 老规矩,先上效果图(环境:API 30 , AS 4.0) OKK,开始动手! 第一步:自定义流式布局 XFlowLayout ,继承ViewGroup,然后重写 on ...

  5. Android自定义View之画圆环(进阶篇:圆形进度条)

    前言: 如果你想读懂或者更好的理解本篇文章关于自定义圆环或圆弧的内容.请你务必提前阅读下Android自定义View之画圆环(手把手教你如何一步步画圆环).在这篇文章中,详细描述了最基本的自定义圆环的 ...

  6. 自定义布局Dialog 自定义dialog右上角带叉号的dialog 点击右上角叉号关闭dialog

    话说之前写过一遍Android中常见的几种Dialog的介绍和基本用法,但是没有讲到实际项目中最常用到的自定义dialog.正好,马上项目要添加新模块,看到里面有用到自定义dialog部分,于是乎趁着 ...

  7. android 继承relativelayout,Android自定义View(RelativeLayout),并嵌套(recyclerView)

    自定义view嵌套使用,简单操作. 一:简单的自定义view(relativeLayout) public class ViewRelativeLayout extends RelativeLayou ...

  8. UICollectionView自定义布局(二)

    这是UICollectionView自定义布局的第二篇,实现类似UltravisualApp的视差效果,同样这篇文章的教程来自Ray家的Swift Expanding Cells in iOS Col ...

  9. iOS开发学无止境 - UICollectionView自定义布局之风火轮[译]

    现在有许多极具创造力的网站,几周前我碰巧浏览到一个名为Form Follows Function的网站,上面有各种交互动画.其中最吸引我的是网站上的导航转轮,转轮由各种交互体验海报组成. 原文:UIC ...

最新文章

  1. linux内存操作----kernel 3.5.X copy_from_user()和copy_to_user()
  2. C#操作数据库(一)【连接SQL Server数据库】
  3. Cloud一分钟 | 阿里云将在英国大区设立数据中心
  4. linux解压覆盖命令
  5. PIL保存二维numpy数组(2,2)为灰度图和RGB图
  6. 【个人笔记】OpenCV4 C++ 快速入门 26课
  7. marqueeview更改字体颜色_安卓手机上可以编辑字体的便签软件哪个好?
  8. 微软开启imap服务器,连接到 IMAP 或 SMTP 服务器
  9. TCP/IP系列概述之体系结构原则
  10. eNSP-利用单臂路由实现VLAN 间路由
  11. js实现中英文合并排序
  12. KUKA机器人视觉1
  13. Unity烘焙官方建议
  14. 2018 ucla计算机排名,2018福布斯最具价值美国大学排名:加州UCLA位列榜首!
  15. [转载] 心目中的编程高手-----后学者以自励
  16. DRF 框架总结 - 视图集路由 Routers
  17. QML遮罩效果Demo
  18. 宽温Android触摸屏,7寸刷卡工控一体机支持IC/ID卡安卓触摸屏
  19. 图的最短路径问题(C++)
  20. C盘清理-我的C盘莫名其妙就满了?

热门文章

  1. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 )
  2. 【Android Protobuf 序列化】Protobuf 使用 ( protoc 编译器简介 | 下载 protoc 编译器 | 使用 protoc 编译器编译 .proto 源文件 )
  3. 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 )
  4. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_1_final关键字概念与四种用法...
  5. 爬虫篇 --- 分布式爬虫
  6. cgi、fastcgi、php-cgi、php-fpm的关系
  7. Angular学习记录一
  8. OSI与TCP/IP协议区别
  9. Python写爬虫只需三步
  10. es2017 提供的针对字符串填充的函数:padStart、padEnd