自定义带边框TextView

给textview加边框

最low的做法、textview外层套一层布局,然后给布局加边框样式(这么弱的做法,不能这么干)

自定义控件

canvas.drawLines

用canvas画四个点


package com.example.csy.activitypractice;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet; /**
* @author CSY
* Created by CSY on 2018/12/3.
*/
public class BorderTextView extends android.support.v7.widget.AppCompatTextView { private int STROKE_WIDTH = 5; public BorderTextView(Context context) {
super(context);
} public BorderTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
} public BorderTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.BLACK);
//边框宽度
paint.setStrokeWidth(STROKE_WIDTH);
//空心
paint.setStyle(Paint.Style.STROKE);
//抗锯齿
paint.setAntiAlias(true); //画线
float[] points = {
0, 0, this.getWidth(), 0,
0, 0, 0, this.getHeight(),
this.getWidth(), 0, this.getWidth(), this.getHeight(),
0, this.getHeight(), this.getWidth(), this.getHeight()};
canvas.drawLines(points, paint);
}
}

canvas.drawRect

canva直接提供了画矩形的方法

drawRect(float left, float top, float right, float bottom, Paint paint) 画矩形


RectF rectF = new RectF(0, 0, this.getWidth(), this.getHeight());
canvas.drawRect(rectF, paint);

canvas.drawRoundRect

之前用Rect画了带矩形边框。现在升级一下画圆角边框


RectF rectF = new RectF(0, 0, this.getWidth(), this.getHeight());
canvas.drawRoundRect(rectF, 20, 20, paint);

如下图

canvas.drawPath

用drawRoundRect出现了粗细不一的边框,怀疑是因为用的裁剪。

所以尝试使用画路径的方法


Path path = new Path();
RectF rectF = new RectF(0, 0, this.getWidth(), this.getHeight());
path.addRoundRect(rectF, 20, 20, Path.Direction.CCW);
canvas.drawPath(path, paint);

但是效果与drawRoundRect一致

边框粗细不一致的问题需要看下自定义view

怀疑是因为边框被裁减了,所以画了两条线,一条从(0,0)开始,另一条从(100,0)开始


Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(50); canvas.drawLine(0,0,0,500,paint);
canvas.drawLine(100,0,100,500,paint);

得到的图片如下图所示:

因此得出

画笔的起始在边框的中间,如若从(0,0)开始画,边框的一半就会被画在画布的外面。

解决

设置padding,减去边框的粗细


Path path = new Path();
RectF rectF = new RectF(STROKE_WIDTH / 2, STROKE_WIDTH / 2, this.getWidth() - (STROKE_WIDTH / 2), this.getHeight() - (STROKE_WIDTH / 2));
path.addRoundRect(rectF, 20, 20, Path.Direction.CCW);
canvas.drawPath(path, paint);

总结

通过本次自定义View的实践,应用了绘图的基础知识,顺带解决了下边框粗细不一的这个问题。这次的应用才只是自定义View的入门——绘图基础的应用而已。后面还有视图动画和属性动画等知识要掌握,加油!

来源:https://blog.csdn.net/menwaiqingshan/article/details/85157660

自定义带边框TextView--边框粗细不一的问题的更多相关文章

  1. WPF进阶教程 - 使用Decorator自定义带三角形的边框

    原文:WPF进阶教程 - 使用Decorator自定义带三角形的边框 写下来,备忘. Decorator,有装饰器.装饰品的意思,很容易让人联想到设计模式里面的装饰器模式.Decorator类负责包装 ...

  2. Qt之界面(自定义标题栏、无边框、可移动、缩放)

    效果 自定义标题栏 titleBar.h #ifndef TITLEBAR_H #define TITLEBAR_H #include <QLabel> #include <QPus ...

  3. css简单实现带箭头的边框

    原文地址 https://tianshengjie.cn/artic... css简单实现带箭头的边框 普通边框 <style> .border { width: 100px; heigh ...

  4. Android实现自定义带文字和图片的Button

    Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...

  5. 自定义带图片和文字的ImageTextButton

    今天我们来讲一下有关自定义控件的问题,今天讲的这篇是从布局自定义开始的,难度不大,一看就明白,估计有的同学或者开发者看了说,这种方式多此一举,但是小编我不这么认为,多一种解决方式,就多一种举一反三的学 ...

  6. padding(内边框), border(边框), margin, 标准文档流, 块级元素和行内元素, 浮动 ,margin的用法

    盒模型 在CSS中,"box model"这一术语是用来设计和布局时使用,然后在网页中基本上都会显示一些方方正正的盒子.我们称为这种盒子叫盒模型. 盒模型有两种:标准模型和IE模型 ...

  7. 自定义带动画的Toast

    一.style样式: 1.  // 移动和透明渐变结合的动画 <style name="anim_view">        <item name="@ ...

  8. Android 自定义带刻度的seekbar

    自定义带刻度的seekbar 1.布局 <span style="font-family:SimHei;font-size:18px;"><com.imibaby ...

  9. [转]Android UI:看看Google官方自定义带旋转动画的ImageView-----RotateImageView怎么写(附 图片淡入淡出效果)

    http://blog.csdn.net/yanzi1225627/article/details/22439119 众所周知,想要让ImageView旋转的话,可以用setRotation()让其围 ...

随机推荐

  1. 牛客网PAT练兵场-数字黑洞

    题解:循环即可 题目地址:https://www.nowcoder.com/questionTerminal/2e6a898974064e72ba09d05a60349c9e /** * Copyri ...

  2. hyperledger-fabric环境快速搭建踩坑集锦(实用)

    安装docker 及 docker-compose 安装docker没什么好说的,一部分教程都给出了指令,在这里就不谈了. docker-compose不同的教程给出了不同的方法,在这里介绍一种极为快 ...

  3. SwiftUI - Grid View 的实现方法,逐步剖析助你实现

    简介 在当前正式 SwiftUI 版本而言,很多控件都是缺少的.比如在 UIKit 框架里有 UICollectionView 组件,可以很方便地做 Gird 格子类型的视图.但是在 SwiftUI ...

  4. 表格取消全选框,用文字表示--Echarts ElementUi

    1.先看看实现的图 一. 添加添加复选框列 <el-table v-loading="zongShipLoading" tooltip-effect="dark&q ...

  5. Micro-CMS v1 (Hacker101 CTF)

    这道题一共有四个flag,初步观察可以创建或者修改发布的内容. Flag1: 首先随便创建了一个页面,创建完成后页面会直接跳转到我们所创建的页面. 初步判断网页应该是根据地址栏后的数字来查询并且显示页 ...

  6. package_ios

    PlistBuddy简单使用 https://www.jianshu.com/p/2167f755c47e xcodebuild 命令 https://www.jianshu.com/p/c32263 ...

  7. qdu-凑数题(01背包)

    Description 小Q手里有n(n<=1000) 个硬币,每枚硬币有一定的金额(200=>x>=1)他想知道,用这些硬币(每枚硬币只能用一次,但可能会有等面值的用两次) 能组成 ...

  8. JAVA线程池原理与源码分析

    1.线程池常用接口介绍 1.1.Executor public interface Executor { void execute(Runnable command); } 执行提交的Runnable ...

  9. 分布式文件存储:FastDFS简单使用与原理分析

    引言 FastDFS 属于分布式存储范畴,分布式文件系统 FastDFS 非常适合中小型项目,在我接手维护公司图片服务的时候开始接触到它,本篇文章目的是总结一下 FastDFS 的知识点. 用了 2 ...

  10. Java的安装和配置

    1. 下载JDK 前往甲骨文官网(https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html)下载JDK,这里 ...