自定义view(使用EditTetx实现记事本特效)

先看一下效果图:

思路: 创建一个类,继承自EditText,在onDraw方法中绘制我们的下划线,通过屏幕的高度和每行控件的高度的比值得出屏幕中应该绘制多少行下划线,再来实现一些自定义的属性,设置控件基本的边距和内容边距就ok了 ,过程很简单的,代码的注释写的很详细,有需要的同学可以去阅读一下

自定义类MyNoteEditText.class

package com.wjt.day43_01_mynoteedittext;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.EditText;

public class MyNoteEditText extends EditText{
   private int lineColor = Color.RED  ;
   private int lineStrokWidth = 1 ;
   private int padding = 10 ;
	public MyNoteEditText(Context context, AttributeSet attrs) {
		super(context, attrs);
		//这句话是让每一行的输入的数据都位于他的左上部分
		setGravity(Gravity.TOP);

		TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyNoteEditText);
		lineColor = array.getColor(R.styleable.MyNoteEditText_lineColor, lineColor);
		lineStrokWidth = (int) array.getDimension(R.styleable.MyNoteEditText_lineStrokWidth, lineStrokWidth);
		padding = (int) array.getDimension(R.styleable.MyNoteEditText_padding, padding);

		array.recycle();

		//实现内容和划线部分的一一对应
		setPadding(padding, 0, padding, 0);

	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		//1,创建一个画笔
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setColor(lineColor);
		paint.setStrokeWidth(lineStrokWidth);

		//2,获取当前整个控件的宽高
	    int viewHeight = getHeight();
		int viewWidth = getWidth() ;

		//3,获取EditText中每一行的宽度
		int lineHeight = getLineHeight();

		//4,通过计算屏幕中一共能放多少行
		int pageLineCounts = viewHeight/lineHeight ;

		//5,使用画布划线
		for (int i = 0; i < pageLineCounts; i++) {
			canvas.drawLine(padding, (i+1)*lineHeight, viewHeight - padding, (i+1)*lineHeight, paint);
		}

		//6,实现当文字写到下一页的时候继续划线
		int textLineCount =getLineCount() ; 

		if (textLineCount > pageLineCounts) {
			for (int i = pageLineCounts; i < textLineCount; i++) {
				canvas.drawLine(padding, (i+1)*lineHeight, viewHeight - padding, (i+1)*lineHeight, paint);

			}
		}

	}
}

 自定义属性部分attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name = "NoteEditText">
        <attr name = "lineColor" format="color|reference"/>
        <attr name = "lineStrokeWidth" format="dimension|reference"/>
        <attr name = "padding" format="dimension|reference"/>
    </declare-styleable>
</resources>

  

时间: 2024-11-04 18:17:53

自定义view(使用EditTetx实现记事本特效)的相关文章

自定义View之实现日出日落太阳动效

以前也很羡慕网上大神随手写写就是一个很漂亮的自定义控件,所以我下决心也要学着去写,刚好最近复习了Android View的绘制流程知识,看来看去就是那些个知识点,没点产出总感觉很迷.现在个人呢用的是华为荣耀8手机,碰巧在看自带的天气APP时,滑到最下面看到那个动效图:日出时间和日落时间上边是一个半圆,白天任意的时刻(在日出和日落时间之间)都有对应一个太阳从日出时刻沿着半圆弧做动画特效,个人第一感觉就是:就拿这个来练练手啦!于是拿着笔和纸,画了模型图,甚至求什么sin.cos函数,有点过分了哈,还

Android自定义View(一、初体验自定义TextView)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51454685 本文出自:[openXu的博客] 目录: 继承View重写onDraw方法 自定义属性 onMeasure方法 MeasureSpec 分析为什么我们自定义的MyTextView设置了wrap_content却填充屏幕 重写onMeasure方法 自动换行 源码下载 对于一个Android攻城狮来说,自定义控件是一项必须掌握的重要技能点,然而对于大部分人而言,感觉自定义控件并

Android初级教程初谈自定义view自定义属性

有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候就要考虑自定义控件.自定义view的世界,也很浩瀚,个人需要学的地方还有很多很多.自定义view,会节省开发效率,很有必要学习其基本原理和方法.接下来就对自定义view,做一个初步的认识,一步步了解封装的重要性.但是,也仅仅是一个初步,因为它实在太灵活了. 有这么一种场景,看图: 除了布局之外,还有

android中自定义view涉及到的绘制知识

android中自定义view的过程中,需要了解的绘制知识. 1.画笔paint: 画笔设置: <span style="font-size:14px;"> paint.setAntiAlias(true);//抗锯齿功能 paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(30);//设置画笔宽度 paint.setShadowLayer(

android自定义View之NotePad出鞘记

现在我们的手机上基本都会有一个记事本,用起来倒也还算方便,记事本这种东东,如果我想要自己实现,该怎么做呢?今天我们就通过自定义View的方式来自定义一个记事本.OK,废话不多说,先来看看效果图. 整个页面还是很简单的. 1.自定义View的分类 OK,那么在正文开始之前,我想先来说说自定义View的分类,自定义View我们一共分为三类 1.自绘控件 自绘控件就是我们自定义View继承自已有控件,然后扩展其功能,之前两篇自定义View的博客(android自定义View之钟表诞生记,android

自定义View系列教程04--Draw源码分析及其实践

通过之前的详细分析,我们知道:在measure中测量了View的大小,在layout阶段确定了View的位置. 完成这两步之后就进入到了我们相对熟悉的draw阶段,在该阶段真正地开始对视图进行绘制. 按照之前的惯例,我们来瞅瞅View中draw( )的源码 public void draw(Canvas canvas) { final int privateFlags = mPrivateFlags; final boolean dirtyOpaque = (privateFlags & PFL

自定义view画图

在实现自定义View之前,有必要掌握Android中画图的相关类的使用方法,这是自定义各种酷炫界面的基础.主要使用到以下两个类: 画笔:Paint 画布:Canvas 1. Android中的Paint和Canvas的概念和使用方法 Android中的Paint和Canvas的概念是很简单的,就是我们用画笔在画布上进行绘制,没什么难度的,我们只要拿到画笔Paint和画布Canvas对象就可以进行操作了.当然Canvas对象提供了很多绘制图形的方法, 1.1 Paint对象 新建一个Paint画笔

Android应用自定义View绘制方法手册

背景 这篇迟迟难产的文章算是对2015前半年的一个交代吧,那时候有一哥们要求来一发Android Canvas相关总结,这哥们还打赏了,实在不好意思,可是这事一放就给放忘了,最近群里小伙伴催着说没更新博客,坐等更新啥的,随先有这么一篇Android应用开发超级基础的文章诞生了(因为这种文章最好写哈,就是用熟了就行).不得不说下这么久为何一直没更新博客的原因了,首先遇上了过年,我个人崇尚过节就该放下一切好好陪陪亲人,珍惜在一起的时光:其次今年开年很是蛋疼,不是不顺当就是深深的觉得被坑,所以心情也就

自定义View 篇三 《手动打造ViewPage》

有了之前自定义View的理论基础,有了ViewPage.事件分发机制.滑动冲突.Scroller使用等相关知识的铺垫,今天纯手动打造一款ViewPage. 1.完成基本的显示: 在MainActivity中: public class MainActivity extends AppCompatActivity { private MyViewPage mViewPage; int[] imageIds = new int[]{ R.drawable.pic_0, R.drawable.pic_