26个英文字母记忆的有效方法

Python08

26个英文字母记忆的有效方法,第1张

英语是拼音文字,所有的词汇都是由26个字母拼出来的,而在成千上万的不同拼法中,基本发音因素却只有39-47个,这说明26个字母与基本音素间是有着一定的关联的。那要怎样去记忆呢?下面是由我给大家带来关于26个英文字母记忆的有效方法,希望对大家有帮助!

26个英文字母记忆的方法

1、母与发音一一对应的辅音

b -- ball

d -- dog

f -- fish

h -- hat

j -- jump

k -- kite

l -- leg

m -- man

n -- not

p -- pen

q – quick

r -- run

s -- sun

t -- ten

v -- vest

w -- water

z -- zoo

* 注:q与u总是连在一起的

2、有多个发音的辅音:

例词:c

字母c后面接a,o,u的时候,c的发音与字母k发音相同,叫做“hard c sound”cat, cap, call, coat, cup

当字母c后面接e,i,或y的时候,通常c的发音与字母s发音相同,叫做“soft c sound”city, ice, rice, face, cell, cent,voice, pencil, juice

有时在e或i前面,c会发/sh/音 ocean, racial, social

例词:g

字母g后面接a,o,u的时候,所发的音叫做“hard g sound” girl, gas, get,give, go

当字母g后面接e,i,或y的时候,有时g的发音与字母j的发音相同,叫做“软g音”age,change, ginger, Egypt, gentle, giraffe, badge

特例:forget, give, girl中的g发hard sound

x x在单词中间或结尾时发/ks/音 box, next, mix, six,fox

x在单词中间时有时发/gz/音 exit, exam, exact

x在单词起始位置时发/z/音 xylophone, xerox

y y在单词起始位置时发音为辅音 yes, you, yard, year, yell

y在单词或音节中间或结尾时被当做元音

y在结尾,单词只有一个音节时y发长/i/音,

y在结尾,单词有两个或以上音节时y发长/e/音

y在单词或音节中间时,发短/i/音

小测试:my, cry, fly, sky

3、辅音字母组合

辅音字母组合的发音很简单,就是把每个辅音字母的发音连在一起就可以了。之所以要把它们单独列出来,一个重要的原因就是,每个辅音字母组合是作为一个整体来看待的,在划分音节的时候是不能把这些辅音字母组合分开的。音节的划分对于一个单词的读音至关重要,我们所学的自然拼音法发音规律,其实都是针对单个音节的,对于多音节的单词来说,要先把单词划分为一个一个的音节,然后再对每个音节应用自然拼音法发音规律。音节的划分规律在后面我们会讲述,目前只需要熟记这些字母组合,以备后用。

字母组合 例词:

带有l的字母组合

bl black,blame, bless, blue, blast

cl --clock,class, clap, clue, close

fl --flag,fly, flat, flash, flower

gl --glass,glad, glide, glue, globe

pl --plate,plane, place, plus, plan

sl --sled,sleep, slow, slide, slim

带有r的字母组合

br --bridge,break, brave, brown, bread

cr --crab,crack, crop, crown, creek

dr --dress,drag, drink, drive, drop

fr --frog,fresh, free, from, front

gr --grape,grade, grass, grin, grunt

pr --press,pride, price, print, proof

tr --truck,track, true, train, tree

带有s的字母组合

sc --scale,scar, score, scare, scuff

sk --skate,skip, skill, skull, skin

sm --smoke,smile, smog, smell, smear

sn --snake,snap, snore, snow, snug

sp --spoon,spin, spot, spell, sport

st --stop,stack, stay, step, still

sw --swim,swell, swing, sweet, swift

tw --twig,tweet, twist, twin, twine

三字母组合

shr --shrink,shred, shrill, shrimp, shrub

spl --splash,split, splice, splint, splurge

spr --spread,spring, spree, sprain, spray

squ --square,squad, squirrel, squat, squeak

str --string,strip, straw, stream, street

thr --throw,three, throne, thrift, thrill

在结尾的字母组合

ck(只发一个/k/音) --duck, pack, quick, luck, rock

ld --cold,gold, held, mild, bald

lk --milk,silk, elk, sulk, skulk

mp --lamp,damp, champ, hump, dump

nch --inch,ranch, lunch, bench, crunch

nd --hand,kind, bend, stand, mind

ng(这个音比较特别,是舌头抵住上颚后方所发出的鼻音)--ring, long, sing, wing, lung

nk --sink,bank, trunk, pink, ink

nt --tent,ant, hunt, sent, mint

sh --fish,rash, brush, wish, trash

st --vest,last, test, list, lost

4、复合字母构成的单音

简单的说,consonant digraph就是两个(或三个)辅音字母在一起只发一个音,通常指以下四种组合:ch(tch),sh,wh和th。

ch和sh的发音有点类似中文“吃”和“湿”发音的前半部分,比如下列例词:chair,check,shoe,shop。

wh的发音可能会比较令人混淆,不同的历史时期,不同地方的人wh的发音会有一些不同。但现在在美式发音里,公认的说法是,一般来说wh与/w/发音相同,但在o前面发/h/音,比如when,what,whale,who,whole。

th的发音则需要一些记忆力了,在下面这些常用词里,th发浊音(舌尖在上下牙齿中间,声带需要振动,声音从牙齿和舌头之间的缝隙里出来):they, them-, their, theirs, the, this, that, these, those, then-,than, though, thus, there-(注意,如果一个单词后面带有小横线,就是指以这个单词开始的所有单词,比如them-包括there,therefore,thereafter等)。其它以th开始的单词基本上都发清音(舌尖在上下牙齿中间,声音从牙齿和舌头之间的缝隙里出来,但是声带不振动),比如think,thank,thirty等。

不发音的辅音字母(Silent Consonants)

在有些辅音字母组合中,其中一个字母是不发音的,该组合所发的音与发音的那个辅音字母所发音相同。下面列出了这些组合:

字母组合 不发音字母 例词

gh h ghost,ghetto, ghastly

gn g gnat,gnarl, gnaw, gnome, sign

kn k knife,knit, know, knock, knee

mb b comb, lamb,thumb, dumb, climb

pn p pneumonia

ps p psalm,psychic, psychology

rh h rhinoceros,rhyme, rhythm

sc c scissors,scent, scene, scenery, scenario

wr w wrong,wrist, wrap, wretch, wrench

gh gh light,high, eight, sigh, night

5、元音概述

我将对元音的发音作详细讲解。英语里元音的发音比较复杂,每个元音都可以发多个音,掌握了元音的发音规律才能对整个单词的发音有比较准确的掌握。

元音概述(The Basics About Vowels)

常说的元音字母有五个:a,e,i,o,u,另外y在一个单词的中间或结尾时也被当做元音。

每个单词里都包含有至少一个元音。

每个单词的每个音节里都包含有至少一个元音。

元音是单词的“最强音”。

元音所发的音取决于该元音在单词中的位置或它是如何与其它元音组合的。

一般来说,除了以下几种情况外,元音都发短音:

1. 该元音是元音字母组合的一部分

2. 该元音后面有字母r

3. 该元音在一个单词或重读音节的结尾

4. 单词以字母e结尾

5. 该元音是元音规则的特例

6、短元音

短元音 例词

A a----ant, and, cat, fast, map

E e----egg, net, let, bed, tent

I i----inch, bit, stick, pin, pig

O o----ox, hot, top, not, got

U u----up, bus, sum, cup, mud

Y y(在单词中部,发短i音)----pyramid, lynx, typical, bicycle, symbol

7、元音

如果一个单词以字母e结尾,前面的元音发长音(magic e)。

如果一个元音是在一个单词或重读音节的结尾,该元音也发长音,

所谓长音就是该元音字母的名字,如A的长音发音为/ei/。

当一个单词或音节里只有一个元音时,该元音发短音,

而当这个单词或音节后面加上字母e,刚才的元音就发长音了,而字母e只起到让前面的元音发长音的作用,自己是不发音的。

例如:can,其中的a发短音,如果结尾加上e,变为cane,元音a就发长音了,而e不发音,我们管字母e叫做magic e。下面的例词都是属于这类的:

game, safe, make, gate, whale

Pete, complete, athlete

nine, side, mile, kite, nice

note, rose, globe, those, bone

cube, rule, June, mute, dune

(注意元音u的长音听上去有两种,一种就是字母u的名字,另一种则类似汉语拼音u的发音,因为有些辅音与u在一起发不出字母u的音,就以汉语拼音u的音来代替,比如rule。)

当元音在单词或重读音节结尾时,该元音发长音,例如:paper, be, she, legal, fiber,piano, open, future, human等等

注意Y在单词的结尾时被当作元音来使用:

当单词只有一个音节时,Y与元音I的长音发音相同,例如:cry, try, by, my。

当单词有两个或以上音节时,Y在单词结尾与元音E的长音发音相同,例如:puppy, baby,candy, city, sorry等。

上节讲到,当一个单词或音节里只有一个元音时,该元音发短音,而当这个单词或音节后面加上字母e,刚才的元音就发长音了,而字母e只起到让前面的元音发长音的作用,自己是不发音的。这个规律可以扩展到复合元音字母的情况,当一个单词或音节里有两个元音时,通常第一个元音发长音,第二个元音不发音。例如:

ai, ay 发长A音,如sail, fail, day, say等。

ea, ee, 发长E音,如 meal, tea, need,feed等。

ie 发长I音,如 tie, lie, pie等。

oa, oe 发长O音,如 load, coat, toe等。

ue, ui 发长U音,如glue, suit, blue,fruit等。

但是,有一些不规则情况使得phonics的规则变得复杂起来,这也正是学习英语单词有挑战性的地方。在一些特殊情况下,单词里只有一个元音的时候,该元音是发长音的,如:

i后面接gh, gn, ld, 或nd时,i发长音,如sign, high, child, kind等。

o后面接ld, st时,o有时发长音,如cold, gold, most,host等,但接st时有时还是发短音的,如lost, cost.

有些复合元音字母也不遵循上述长音规律,见下表:

字母组合 所发音 例词

ea 短e head, bread, heavy, dead, ready

ei 长a eight, veil, neigh, weight, freight

oo 长u(类似汉语拼音的u) moon, zoo, school, pool, tool

oo 短u(类似汉语拼音的u) book, look, wood, foot, cookie

eu 长u euro, feud, eulogy, sleuth, pneumonia

ew 长u chew, new, few, stew, blew

ie 长e yield, chief, relief, believe, puppies

ey 长e monkey, money, honey, hockey, volley

学习phonics,除了要熟记各种规则外,还应多读,多练,才能把各种不规则发音牢记在心,灵活运用。

8、双元音

双元音Diphthong与上节所述的复合元音字母构成的单音(digraph)的区别在于,diphthong是两个元音在一起所发的音是两个元音音素组合在一起的,所以听上去有两个音,尽管这两个音并不是两个元音所单独发出的,而digraph是两个元音在一起,但是只发一个单音。把什么元音组合划归为双元音有着不同的说法,一般来说下面两种发音肯定是双元音:

1、 oi, oy组合,把O 和I 的短音组合在一起连贯发出来,比如coin, voice, toy, boy等。

2、 ou, ow组合,发音时先发类似汉语拼音ao的音,然后末尾再加上短促的类似汉语拼音u的音,例如house, found, owl, now等。

带有r的元音(R-controlled Vowels)

元音字母与r结合起来,会发全新的音,见下表:

组合 所发音 例词

ar字母r的名字 car, marble, far, large, party

or/or/ fork, or, for, core, more, pork

/er/ worm, word, world, doctor, neighbor

er, ir, ur /er/nurse, girl, ever, sir, purple

特殊元音(Special Vowel Sounds)

字母或组合 所发音 例词

awpaw, law, raw, saw, dawn

allball, call, fall, mall, tall

auhaul, taught, caught, sauce

oucough, bought, brought, thought

o(后面接ng的时候)song, long,strong, wrong

“broadsound”,比短o音嘴型要小,发音时间长

a, e, i, o, u 非重读音(schwa sound),当一个元音在非重读音节里时,有时会发此类音,非常类似汉语拼音里的e,但发音很轻。 about, elephant, banana, machine, confuse

ce, ci, si, ti 在同一个音节里这些字母组合后面接另外一个元音时,发/sh/音ocean, special, mission, nation, delicious, magician

io 后面接字母n时,i发y音 onion, billion, opinion, stallion

26个英文字母记忆方法

1、巧用歌谣区分字形:

遇到形近的字母,可以通过歌谣作强化记忆。

如d和b,“一把剪刀分两半,左下圆圈ddd,右下圆圈bbb”

u和n,“开口朝上uuu,开口朝下nnn”

m和n,“一道门儿是n,二道门儿是m”。

2、巧用歌谣记牢笔顺:

“大写字母A, E, F, H,小写字母f和t,最后才把腰带系。”这句话的意思告诉孩子,字母有中横的,如“A, E, F, H, f, t”等,中间的那横像腰带,要最后写。

“小写字母i和j,出门再戴小帽子。” 小写字母如“i, j”等,顶上那一点如同小帽子,也要最后写。

3、巧用熟悉的事物:

字母 “E”像一座楼房,得先把外墙砌好,才能盖屋顶,所以要先写竖折,再写两横。

字母 “F”象旗子。讲解:“要把F这面旗子插牢,得先把旗杆写正,先写一竖。”

英文字母起源→ 示图表达A-牛头 B-房子、鸟嘴 C,G-房角 D-门 E-举着双手的人 F-沙粒 H-荷花 I-手 K-皇帝 L-鞭子 M-水or波浪 N-鼻子 O-圆的东西 P-嘴 Q,R-人头 S-太阳,沙丘 T-十字架 V-龙 X-十字架 Z-闪电

猜你喜欢:

1. 英语单词记忆的20种方法

2. 经典的英语学习方法总结

3. 最新26个字母书写顺口溜集锦

4. 26个英文字母背写顺口溜

5. 英文字母记忆表演的超级记忆术

6. 26个字母的联想记忆法

Android - Canvas 简单总结 : http://www.cnblogs.com/hwgt/p/5416866.html

在自定义控件时,经常需要使用canvas、paint等,在canvas类中,绘画基本都是靠drawXXX()方法来完成的,在这些方法中,很多时候都需要用到paint类型的参数,本文先对paint类常用的一些设置做个简单总结

paint 属性设置简单总结

图形绘制相关:

public void set(Paint src)  根据已有画笔的属性进行赋值

public void setColor(int color) 设置颜色

public void setAlpha(int alpha) 设置透明度,alpha为透明度,取值范围为0~255,数值越小越透明

public void setARGB(int a, int r, int g, int b)  设置透明度和颜色,a代表透明度,r,g,b代表颜色值

public void setAntiAlias(boolean aa) 设置是否使用抗锯齿功能,比较耗资源,减慢绘制速度

public void setDither(boolean dither) 设定是否使用图像抖动,如true,绘制出来的图片颜色更饱满、清晰

public void setStyle(android.graphics._Original_Paint.Style style) 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE

以下这段文字来源于网络,谢谢作者!

当我们在调用drawCircle、drawOval、drawArc、drawRect等方法时,我们既可以绘制对应图形的填充面,也可以只绘制该图形的轮廓线,控制的关键在于画笔Paint中的style。Paint通过setStyle方法设置要绘制的类型,style有取三种值:Paint.Style.FILL、Paint.Style.STROKE和Paint.Style.FILL_AND_STROKE。

当style为FILL时,绘制是填充面,FILL是Paint默认的style;

当style为STROKE时,绘制的是图形的轮廓线;

当style为FILL_AND_STROKE时,同时绘制填充面和轮廓线,不过这种情况用的不多,因为填充面和轮廓线是用同一种颜色绘制的,区分不出轮廓线的效果。

public void setStrokeCap(Cap cap)

当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式  Cap.ROUND,或方形样式Cap.SQUARE

public void setStrokeWidth(float width) 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度

文字绘制相关:

public void setTextSize(float textSize) 设置文字大小

public void setTextScaleX(float scaleX) 设置文字x轴的缩放比例,可以实现文字的拉伸效果

public void setTextSkewX(float skewX)  设置文字倾斜弧度

public void setUnderlineText(boolean flag) 设置文字下划线效果

public void setStrikeThruText(boolean flag) 设置删除线效果

public Typeface setTypeface(Typeface typeface) 设置字体风格

public void setTextAlign(android.graphics._Original_Paint.Align align) 设置文字的对齐方向

其中有两个属性设置需要作说明:

1、public Typeface setTypeface(Typeface typeface) ,接收参数为 Typeface对象,在Typeface.java类中,比较简单的,有defaultFromStyle方法返回Typeface对象:

public static Typeface defaultFromStyle(int style) {}

2、public void setTextAlign(android.graphics._Original_Paint.Align align) 设置文字的对齐方向,接收的参数为Paint的内部枚举类Align的值,可选LEFT、CENTER和RIGHT。

下边是文字绘制时常用的属性设置例子:

publicvoid draw(Canvas canvas) {

super.draw(canvas)

paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD))

paint.setColor(Color.RED)

paint.setTextSize(41)

paint.setTextAlign(Align.CENTER)

paint.setTextScaleX(2.5f)

paint.setTextSkewX(-0.5f)

paint.setUnderlineText(true)

paint.setStrikeThruText(true)

canvas.drawText("hwgt的博客",0,41, paint)

... ...

}

另外,需要注意的是:Canvas的drawText()方法中,如不setTextAlign(... ...)的话,第二个参数 x 默认是字符串的左边的位置,第三个参数则固定为这个字符串的baseline的位置。

Canvas属性与方法

首先列出canvas以draw开头的方法:

设置ARGB、颜色填充画布:

publicvoid drawARGB(int a,int r,int g,int b) {}

publicvoid drawColor(int color) {}

publicvoid drawRGB(int r,int g,int b) {}

canvas.drawARGB(50,255,0,0)//参数即为ARGB的值

画点:

publicnativevoid drawPoint(float x,float y, Paint paint)

//参数比较明显,就是点的坐标,需要注意的是,在绘制点之前,需要设置画笔的宽度,否则不能画出来

paint.setStrokeWidth(13)

//另外,还可以设置画笔的样式,来指定所画的点的样式,圆形还是方形

paint.setStrokeCap(Paint.Cap.ROUND)//或者paint.setStrokeCap(Paint.Cap.BUTT)

canvas.drawPoint(100,100, paint)

画直线:

publicvoid drawLine(float startX,float startY,float stopX,float stopY, Paint paint) {}

canvas.drawLine(100,100,500,500, paint)//参数为起点和终点的XY坐标

画圆:

publicvoid drawCircle(float cx,float cy,float radius, Paint paint) {}

canvas.drawCircle(200,200,100, paint)//参数为圆心坐标和半径

绘制矩形:

publicvoid drawRect(float left,float top,float right,float bottom, Paint paint) {}

publicvoid drawRect(RectF rect, Paint paint) {}

publicvoid drawRect(Rect r, Paint paint) {}

// RectF 和 Rect  都可用来定义一个矩形区域,主要区别是参数类型不同,一个是int类型,一个是float类型

private RectF mRectF

mRectF =new RectF(100,100,200,500)

canvas.drawRect(mRectF, paint)

绘制圆角矩形:

publicvoid drawRoundRect(RectF rect,float rx,float ry, Paint paint) {}

private RectF mRectF

mRectF =new RectF(100,100,500,500)//定义一个区域

canvas.drawRoundRect(mRectF,20,50, paint)//第二、三个参数分别定义x和y方向的圆角弧度

绘制一个区域的内切圆或椭圆(视所定义的矩形而定):

publicvoid drawOval(RectF oval, Paint paint) {}

private RectF mRectF

mRectF =new RectF(100,100,200,500)

canvas.drawOval(mRectF, paint)

绘制弧形区域:

publicvoid drawArc(RectF oval,float startAngle,float sweepAngle,boolean useCenter,Paint paint) {}

private RectF mRectF

mRectF =new RectF(100,100,200,200)//定义一个矩形区域

canvas.drawArc(mRectF,0,90,false, paint)

//第二个参数为起始弧度,第三个为终止弧度,第四个为显示方式

绘制路径 — Path 的使用:

publicvoid drawPath(Path path, Paint paint) {}

paint.setStyle(Paint.Style.STROKE)

paint.setStrokeWidth(3)

mPath =new Path()

mPath.moveTo(100,100)

mPath.lineTo(200,100)

mPath.lineTo(150,150)

mPath.lineTo(150,350)

mPath.close()

canvas.drawPath(mPath, paint)

绘制路径,即指定几个点的坐标,然后按照顺序将这些点连接起来,那么,首先需要指定起点,使用moveTo方法,如果没有使用moveTo方法指定起点的话,默认起点为(0,9),然后用lineTo方法指定需要经过的点,最后,如果起点和终点的坐标不一样,并且需要将起点和终点连接起来的话,就调用close方法,如不调用close方法的话,起点和终点是不会被连接起来的。

绘制文本:

publicvoid drawText(String text,float x,float y, Paint paint) {}

publicvoid drawText(char[] text,int index,int count,float x,float y, Paint paint) {}

publicvoid drawText(String text,int start,int end,float x,float y, Paint paint) {}

canvas.drawText("hwgt",100,100, paint)

canvas.drawText(newchar [] {'h','w','g','t','3','1','3','3'},2,3,100,100, paint)

canvas.drawText("hwgt3133",2,4,100,100, paint)//含头不含尾

按照指定点的坐标绘制文本:

publicvoid drawPosText(String text,float[] pos, Paint paint) {}

publicvoid drawPosText(char[] text,int index,int count,float[] pos, Paint paint) {}

canvas.drawPosText("hwgt",newfloat[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,}, paint)

canvas.drawPosText(newchar[]{'h','w','g','t'},3,1,newfloat[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,}, paint)

//推荐使用第二个方法,if (index < 0 || index + count > text.length || count*2 > pos.length),就会报错

按照指定的路径绘制文本:

publicvoid drawTextOnPath(String text, Path path,float hOffset,float vOffset, Paint paint) {}

canvas的save和restore方法:

在绘制图形的过程中,会需要对画布进行旋转,缩放,平移等操作,但对画布进行比如平移操作之后,会对以后画上去的内容也产生影响,有时,我们只希望这种平移或是旋转操作只是临时作用于画布上的某些内容,这个时候就可以使用save和restore方法,save和restore方法一般是配对使用的,例如:

paint.setFakeBoldText(true)// 将画笔设置为粗体

canvas.drawText("00000000",0,75, paint)

canvas.save()

canvas.translate(0,250)

canvas.drawText("||||||||||||||||",0,75, paint)

canvas.restore()

canvas.drawText("—————",0,75, paint)

去掉save和restore方法即能看出效果。

实现手写功能的主要步骤:

1. 自定义两个View,一个是TouchView,用于在上面画图,另一个是EditText,用于将手写的字显示在其中,并且,要将两个自定义View通过FrameLayout帧式布局重叠在起,以实现全屏手写的功能。

2 在TouchView中实现写字,并截取画布中的字以Bitmap保存。

3. 设置定时器,利用handle更新界面。

下面是实现的细节:

1. 手写的界面设计:

如上图所示,和上节的画板界面一致,底部分选项菜单栏,有5个选项,分别是调整画笔大小,画笔颜色,撤销,恢复,以及清空,对于这些功能,之后几节再实现。

布局文件activity_handwrite.xml

<!--?xml version=1.0 encoding=utf-8?-->

<relativelayout android:background="@android:color/white" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"><imageview android:layout_above="@+id/paintBottomMenu" android:layout_height="wrap_content" android:layout_width="match_parent" android:src="@drawable/line">

</imageview></relativelayout>

可以看出,里面有两个自定义view,并且通过FrameLayout重叠在一起。

先来看com.example.notes.LineEditText,这个其实和添加记事中的界面一样,就是自定义EditText,并且在字的下面画一条线。

LineEditText.java

public class LineEditText extends EditText {

  private Rect mRect

  private Paint mPaint

 

  public LineEditText(Context context, AttributeSet attrs) {

      // TODO Auto-generated constructor stub

      super(context,attrs)

      mRect = new Rect()

      mPaint = new Paint()

      mPaint.setColor(Color.GRAY)

  }

 

  @Override

  protected void onDraw(Canvas canvas) {

      super.onDraw(canvas)

      //得到EditText的总行数

      int lineCount = getLineCount()

      Rect r = mRect

      Paint p = mPaint

      //为每一行设置格式

      for(int i = 0i <lineCounti++){

          //取得每一行的基准Y坐标,并将每一行的界限值写到r中

          int baseline = getLineBounds(i, r)

          //设置每一行的文字带下划线

          canvas.drawLine(r.left, baseline+20, r.right, baseline+20, p)

      }

  }

}

另一个就是com.example.notes.TouchView,实现了绘制,及定时更新界面的功能,具体看代码

TouchView.java

public class TouchView extends View {

  private Bitmap  mBitmap,myBitmap

  private Canvas  mCanvas

  private Path    mPath

  private Paint   mBitmapPaint

  private Paint mPaint

  private Handler bitmapHandler

  GetCutBitmapLocation getCutBitmapLocation

  private Timer timer

  DisplayMetrics dm

  private int w,h

  public TouchView(Context context) {

      super(context)

      dm = new DisplayMetrics()

      ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm)

      w = dm.widthPixels

      h = dm.heightPixels

      initPaint()

  }

 

  public TouchView(Context context, AttributeSet attrs) {

      super(context,attrs)

      dm = new DisplayMetrics()

      ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm)

      w = dm.widthPixels

      h = dm.heightPixels

      initPaint()

  }

  //设置handler

  public void setHandler(Handler mBitmapHandler){

      bitmapHandler = mBitmapHandler

  }

 

  //初始化画笔,画布

  private void initPaint(){

      mPaint = new Paint()

      mPaint.setAntiAlias(true)

      mPaint.setDither(true)

      mPaint.setColor(0xFF00FF00)

      mPaint.setStyle(Paint.Style.STROKE)

      mPaint.setStrokeJoin(Paint.Join.ROUND)

      mPaint.setStrokeCap(Paint.Cap.ROUND)

      mPaint.setStrokeWidth(15)

      getCutBitmapLocation = new GetCutBitmapLocation()

     

      //画布大小

      mBitmap = Bitmap.createBitmap(w, h,

          Bitmap.Config.ARGB_8888)

      mCanvas = new Canvas(mBitmap) //所有mCanvas画的东西都被保存在了mBitmap中

     

      mCanvas.drawColor(Color.TRANSPARENT)

      mPath = new Path()

      mBitmapPaint = new Paint(Paint.DITHER_FLAG)

      timer = new Timer(true)

  }

 

  /**

   * 处理屏幕显示

   */

  Handler handler = new Handler(){

      public void handleMessage(Message msg) {

          switch (msg.what) {      

          case 1:

              myBitmap = getCutBitmap(mBitmap)

              Message message = new Message()

              message.what=1

              Bundle bundle = new Bundle()

              bundle.putParcelable(bitmap,myBitmap)

              message.setData(bundle)

              bitmapHandler.sendMessage(message)

              RefershBitmap()

              break

          }

          super.handleMessage(msg)

      }

  }

 

  /**

   * 发送消息给handler更新ACTIVITY    

   */

  TimerTask task = new TimerTask() {

      public void run() {

          Message message = new Message()

          message.what=1

          Log.i(线程, 来了)

          handler.sendMessage(message)

      }

  }

 

  //切割画布中的字并返回

  public Bitmap getCutBitmap(Bitmap mBitmap){

      //得到手写字的四周位置,并向外延伸10px

      float cutLeft = getCutBitmapLocation.getCutLeft() - 10

      float cutTop = getCutBitmapLocation.getCutTop() - 10

      float cutRight = getCutBitmapLocation.getCutRight() + 10

      float cutBottom = getCutBitmapLocation.getCutBottom() + 10

     

      cutLeft = (0 >cutLeft ? 0 : cutLeft)

      cutTop = (0 >cutTop ? 0 : cutTop)

     

      cutRight = (mBitmap.getWidth() <cutRight ? mBitmap.getWidth() : cutRight)

      cutBottom = (mBitmap.getHeight() <cutBottom ? mBitmap.getHeight() : cutBottom)

     

      //取得手写的的高度和宽度

      float cutWidth = cutRight - cutLeft

      float cutHeight = cutBottom - cutTop

     

      Bitmap cutBitmap = Bitmap.createBitmap(mBitmap, (int)cutLeft, (int)cutTop, (int)cutWidth, (int)cutHeight)

      if (myBitmap!=null ) {

          myBitmap.recycle()

          myBitmap= null

      }

     

      return cutBitmap

  }

 

  //刷新画布

  private void RefershBitmap(){

      initPaint()

      invalidate()

      if(task != null)

          task.cancel()

  }

 

  @Override

  protected void onDraw(Canvas canvas) {          

      canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint)    //显示旧的画布    

      canvas.drawPath(mPath, mPaint) //画最后的path

  }

 

  private float mX, mY

  private static final float TOUCH_TOLERANCE = 4

 

   //手按下时

  private void touch_start(float x, float y) {

      mPath.reset()//清空path

      mPath.moveTo(x, y)

      mX = x

      mY = y

      if(task != null)

          task.cancel()//取消之前的任务

      task = new TimerTask() {

         

          @Override

          public void run() {

              Message message = new Message()

              message.what=1

              Log.i(线程, 来了)

              handler.sendMessage(message)

          }

      }

      getCutBitmapLocation.setCutLeftAndRight(mX,mY)

  }

  //手移动时

  private void touch_move(float x, float y) {

      float dx = Math.abs(x - mX)

      float dy = Math.abs(y - mY)

      if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {

          mPath.quadTo(mX, mY, x, y)

          // mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2)//源代码是这样写的,可是我没有弄明白,为什么要这样?

          mX = x

          mY = y

          if(task != null)

              task.cancel()//取消之前的任务

          task = new TimerTask() {

             

              @Override

              public void run() {

                  Message message = new Message()

                  message.what=1

                  Log.i(线程, 来了)

                  handler.sendMessage(message)

              }

          }

          getCutBitmapLocation.setCutLeftAndRight(mX,mY)

       

      }

  }

  //手抬起时

  private void touch_up() {

      //mPath.lineTo(mX, mY)

      mCanvas.drawPath(mPath, mPaint)

      mPath.reset()

     

      if (timer!=null) {

          if (task!=null) {

              task.cancel()

              task = new TimerTask() {

                  public void run() {

                      Message message = new Message()

                      message.what = 1

                      handler.sendMessage(message)

                  }

              }

              timer.schedule(task, 1000, 1000)              //2200秒后发送消息给handler更新Activity

          }

      }else {

          timer = new Timer(true)

          timer.schedule(task, 1000, 1000)                  //2200秒后发送消息给handler更新Activity

      }

     

  }

 

  //处理界面事件

  @Override

  public boolean onTouchEvent(MotionEvent event) {

      float x = event.getX()

      float y = event.getY()

     

      switch (event.getAction()) {

          case MotionEvent.ACTION_DOWN:

              touch_start(x, y)

              invalidate()//刷新

              break

          case MotionEvent.ACTION_MOVE:

              touch_move(x, y)

              invalidate()

              break

          case MotionEvent.ACTION_UP:

              touch_up()

              invalidate()

              break

      }

      return true

  }

}

这里面的难点就是利用TimerTask和Handle来更新界面显示,需要在onTouchEvent的三个事件中都要通过handle发送消息来更新显示界面。

接下来就是在activity里通过handle来得到绘制的字,并添加在editText中。

关于配置底部菜单,以及顶部标题栏,这里不再赘述,直接如何将绘制的字得到,并添加在edittext中:

得到绘制字体的Bitmap

//处理界面

Handler handler = new Handler(){

   @Override

   public void handleMessage(Message msg) {

       super.handleMessage(msg)

     

       Bundle bundle = new Bundle()

       bundle = msg.getData()

       Bitmap myBitmap = bundle.getParcelable(bitmap)

       InsertToEditText(myBitmap)

   }

}

其中myBitmap就是取得的手写字,保存在Bitmap中, InsertToEditText(myBitmap)是将该图片添加在edittext中,具体如下:

?

1

private LineEditText et_handwrite 

?

1

et_handwrite = (LineEditText)findViewById(R.id.et_handwrite)

//将手写字插入到EditText中

private void InsertToEditText(Bitmap mBitmap){

             

   int imgWidth = mBitmap.getWidth()

   int imgHeight = mBitmap.getHeight()

   //缩放比例

   float scaleW = (float) (80f/imgWidth)

   float scaleH = (float) (100f/imgHeight)

 

   Matrix mx = new Matrix()

   //对原图片进行缩放

   mx.postScale(scaleW, scaleH)

 

   mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, imgWidth, imgHeight, mx, true)

   //将手写的字插入到edittext中

   SpannableString ss = new SpannableString(1)

   ImageSpan span = new ImageSpan(mBitmap, ImageSpan.ALIGN_BOTTOM)

   ss.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)

   et_handwrite.append(ss)

}