2014年6月29日 星期日

優秀是教出來的 (The Essential 55 by Ron Clark)

http://neptuner.666forum.tw/t114-topic

序: 我要給每個學生一個不同的人生。

克拉克老師的55條班規如下:

超基本 1:
遇到大人,要主動稱呼。大人問你話,你一定要清楚回答:「是/不是/好/不好/有/沒有」,或說「我不知道」。不可以光是點點頭或搖搖頭,也不可以含糊答「哦」或「嗯」。

超基本 2:
當別人在講話話,你的眼睛要一直看著他。如果旁邊有人發言,你就轉頭去面對那個說話的人。

超基本 3:
如果班上有同學贏得比賽,或有什麼出色的表現,大家都應該鼓掌恭喜他。鼓掌應該持續至少三秒,手掌的角度要剛好,才能拍出響亮的掌聲。

超基本 4:
課堂上進行討論時,要尊重別的學生的看法和意見。盡可能這麼說:「我同意約翰的說法,而且我還覺得…」或是「我不同意莎拉的看法。她的觀點很好,可是我認為…」或是「我認為維克多的看法很棒,他的話讓我想到…」。

超基本 5:
贏 得任何比賽,或有任何好表現,都不可以炫耀。如果輸了,也不要顯露出生氣的模樣。你可以這樣說:「參加剛剛這場比賽真是愉快,希望將來還能和你較較高 下。」要不然就說:「是很不錯的一場比賽。」不然就什麼都別說。生氣或說話酸溜溜,說什麼「我剛剛又沒盡全力,你真的沒那麼好」之類的,只是表示你很遜而 已。

超基本 6:
如果有人問你一個問題,你應該也回問他一個問題。如果有人問:「你這個週末愉快嗎?」你不只應該回答愉不愉快,還要回問他。舉例來說:
我:「你這個週末愉快嗎?」
你:「很愉快,我和家人去逛街買東西。你呢?你這個週末愉快嗎?
讓別人知道,你就跟他關心你一樣地關心他,這是基本的禮貌。

超基本 7:
咳嗽、打噴嚏、打嗝時,得體的做法是別過頭去,並用整個手掌掩口,然後你應該說聲:「對不起。」

超基本 8:
不要用咂嘴、翻白眼等類似動作表示輕蔑。

超基本 9:
每次我送你什麼獎品,你一定要說謝謝。如果你在收到獎品三秒之內沒有說謝謝,我會把送給你的東西要回來。因為不表示感謝是沒有藉口可以通融的。

超基本10:
有人送你東西時,絕對不要嫌棄禮物,也不要暗示你不領情,侮辱送禮的人。

超基本11:
隨時為別人做一些小小的貼心服務,帶給別人一個小驚喜,至少一個月一次。

超基本12:
偶而我會讓學生相互改考卷。為同學打分數時,如果你打錯分數,不管是打太高或打太低,多給的或少給的分數將由你自己的分數扣除。在別人的考卷上只能打「x」,以及答錯題的數目。

超基本13:
我們在課堂上一起讀課文時,你眼睛一定要看著課文一字一句。如果我叫你一人把課文讀下去,你一定要知道我們讀到哪裡,立刻就接著讀下去。

超基本14:
用紙筆作答的所有問答題,都應該以完整的句子回答。舉例來說,如果題目是:「俄羅斯的首都在那裡?」應該答:「俄羅斯的首都是莫斯科。」
此外,與別人對話時,以完整的句子回答問題也很重要,因為那是表現尊重。譬如,如果有人問:「你還好嗎?」 你不應該只說「很好」,而應該說:「我很好,謝謝。你呢?」 。
問題範例:籃球選手中,你認為誰比較棒,勞埃德或傑森?
1.重述問題並寫出答案:
籃球選手中,我認為勞埃德比較棒。
2.你為什麼這麼認為,說出一個理由:
我認為勞埃德比較棒,因為他投出致勝的一球。
3.把理由再加強一些:
他投出致勝的一球,表示他能在壓力下保持冷靜,具有求勝的決心。
4.重述問題並做結論。
因此,我認為勞埃德是比傑森優秀的球員。

超基本15:
學 年中我不時會發獎品,獎勵學生在操行或學業各方面的優秀表現。可是,如果你開口主動要獎品,我就不會給。開口問表現良好有沒有獎,是很沒禮貌的。你努力做 個好學生,應該是為了你自己好,而不是為了要有獎品。我通常會獎勵每一個在單元測驗考一百分的同學。如果你考一百分,並開口問你有沒有獎品,所有考一百分 的同學就通通都沒有獎品。

超基本16:
每個學生每天都要交每一科目的家庭作業,沒有例外。
第一招 就是留校輔導
第二招 我製作一個追縱家庭作業完成記錄的統計牌。
本班已經連續____天全體同學都做完家庭作業。
第三招 我善用同伴壓力。

超基本17:
課堂上,教完一科要換別科時,換的過程要迅速、安靜、有秩序。大家應該總是以最快的速度,從一本課本換到另一本,連帶所有家庭作業和必要的教材都準備好。轉換的時間應該不超過十秒鐘,我們則以七秒鐘為目標。

超基本18:
做什麼事都要盡可能有條不紊。

超基本19:
當我指派家庭作業時,不要抱怨。抱怨將導致作業分量加倍。

超基本20:
代課老師來代課時,你們要和我在的時候一樣遵守班規。(我知道執行起來有困難,但還是很重要。)

超基本21:
要遵守某些課堂禮儀。為了要專心、有條理、有效率,要遵守下列規矩:
A.未經許可,不要離開你的座位。例外是身體不舒服的時候,不舒服的話,不用問老師,快去洗手間或醫護室。
B.不要發言,除非
1.你有舉手,我也叫了你的名字。
2.我問你問題,你回答。
3.在下課或午餐時間。
4.老師說你可以說話的時候(像分組討論)。

超基本22:
你可以帶一瓶開水放在桌上。我在上課時不可以問你是不是可以去倒水。你甚至可以放吃的東西在桌上,只要別人沒看到,我也聽不到你吃東西的聲音。
打開任何包裝絕對不能發出聲響。
不能讓班上任何人聽到咀嚼的聲音。
不可以在桌子附近留下食物殘渣。

超基本23:
快 速記住學校其他老師的姓名,並這樣打招呼:「葛蘭姆老師早」或「歐提茲老師好。老師今天穿的很漂亮。」(註:如果是全班列隊前進,照規矩是不准說話的,所 以這時不可以和遇到的老師說話。但是在上下學、下課休息、幫老師跑腿、外出辦事或換教室上課時,你就應該和其他老師打招呼。)

超基本24:
如廁後要沖水和洗手。使用公廁的話,洗手前要先拿一張紙巾。洗完手要拿著紙巾關水龍頭,再取另一張紙巾擦乾雙手。絕對不要用乾淨的手去碰別人髒手碰過的地方。

超基本25:
學校會有訪客來參觀。如果來參觀我們班,我將會派兩名學生去外面迎接。負責去迎接的學生會拿一個歡迎某某先生或某某女士光臨的牌子。來賓到達時,這兩名學生要和他握手,介紹自己的名字,並歡迎這位來賓光臨。兩位學生先帶來賓簡單參觀大樓的設施,再帶來賓到教室。

超基本26:
在校內的公用場所,不要幫要好的同學佔位子。如果有同學想坐下,就讓他坐。不要排拒任何人。全校都是一家人,彼此之間要親切,要尊重。

超基本27:
不管是我還是其他老師責罰某名學生時,同學都不可以盯著那個學生看。如果是你惹麻煩挨罵,你也不希望別人看著你,所以別的同學挨罵時,請不要看著他。如果是你正在被我挨罵,也請不要生那些看你同學的氣。若有請告訴我,讓我來處理。

超基本28:
如果你有家庭作業的問題,你可以打電話給我。如果我不在家,可以這樣留言:「克拉克老師您好,我是誰誰誰。我的什麼什麼作業有問題要請教您。可能的話請您在幾點鐘之前回電話給我。謝謝。」沒必要留言十四次。

超基本29:
用餐時有些禮儀一定要遵守,我稱之為「用餐禮儀ABC」。

超基本30:
用餐完畢要自行清理。要清潔桌面,確定沒有留下垃圾在地上或附近。不論你身在何處,都要為你自己製造的垃圾負責,確定沒有亂丟,這很重要。

超基本31:
你在餐廳、旅館等場合所受到的服務,你要懂得惜福感恩。

超基本32:
搭公車或校車,總是面朝著前方坐著。絕對不要轉頭和其他學生交談,不要把任何東西伸出窗外,不要離開座位走來走去。下車時,一定要和司機說謝謝。

超基本33:
到校外進行戶外教學時,我們會遇見不同的人。當我介紹你們認識這些人時,你們要記住對方的名字。大家離去時,一定要握手道謝,記得要稱呼對方。

超基本34:
有機會讓你拿東西吃時,不論是「吃到飽」的自助餐還是班上有人請客,絕對不要貪多拼命多拿。不只是因為吃不完會浪費,也因為你如果沒留下足夠別人吃的分量,是很失禮的行為。

超基本35:
不論我們是在校內,還是出去做校外教學,如果有人掉了東西,請幫忙撿起來,並物歸原主。即使物主比較靠近東西掉的位置,你還是要彎腰幫忙撿,這樣才顯得有教養。

超基本36:
如果你走進一扇門,有人在你後面,你要幫他扶住門。如果門是用拉的,你就拉開門,但自己先不進去,扶著門在旁,禮讓另一個人先行,你自己再進去。如果門是用推的,你自己就先進去,再幫後面的人扶住門。

超基本37:
如果有人撞到你,即使不是你的錯,也要說:「對不起。」

超基本38:
當我們舉辦校外教學時,進去任何場所都不可以講話。大家就悄悄地進去,安靜到沒人注意到我們的存在。無論是電影院、教堂、劇院或任何人群聚集的場所,都適用這條班規。

超基本39:
進 行校外參訪時,不妨讚美一下我們正在參觀的地方。譬如:如果參觀的是別人的家,讚美他家的窗帘很漂亮,聽起來就會讓人覺得很窩心。有客人來家中,主人多少 有點不自在,你的讚美可以讓主人放輕鬆。此外,如果我們在參觀博物館或劇院等場所,稱讚建築很有格調,或是跟導遊說整個設施很棒,都是一種禮貌。

超基本40:
全校集會時,不要說話,不要東張西望,也不要試圖吸引別班朋友的注意。我們所呈現出來的形象,就是自愛、自重!

超基本41:
當你在家接聽電話時,一定要應答得體。

超基本42:
校外參訪結束,你們要握一握我的手以及每一位隨行老師或家長的手。要說謝謝我們花時間帶你們出來,要說你很高興有這次參訪機會。我關心的不是我自己是否被感謝,我是要教你在有人撥出時間精力為你付出時,你要適當地表示感恩。

超基本43:
進行校外參訪,要搭電扶梯時,大家要靠右邊站,讓趕時間的人從左邊通行。當我們要進入升降梯、地鐵、進出口時,都要先等裡面的人出來,我們再進入。

超基本44:
排隊時要排成一列,距離前面同學兩、三呎(七、八十公分),雙手垂兩側。臉朝前,絕對不要說話。

超基本45:
絕對不要插隊。如果有人在你面前插隊,不要說什麼或做什麼。就讓那個人插隊,但要讓我知道這件事,我會處理。如果你打抱不平,可能會惹上麻煩,那不值得。只要讓我知道就好了。請以同樣的方式處理同學之間的所有紛爭,在你自己解決任何問題之前先來找我。

超基本46:
到 電影院看電影時,無論如何都不要講話。我不管電影有多好看,也不管你要告訴旁邊的人什麼事,連悄悄話也不行!不可以把腳放在前面的椅子上。如果要吃東西, 必須盡可能不出聲。如果買一包糖果想在看電影的時候吃,你要在開演前就打開包裝。電影看一半打開糖果袋,是會吵到別人的。看電影時開著行動電話或呼叫器, 也很失禮。

超基本47:
不可以帶零嘴「多力多滋」來學校。

超基本48:
如果有任何同學找你麻煩,讓我知道。我是你的老師,我本來就應該照顧你和保護你。我不會讓學校裡的任何人欺負你或讓你覺得不舒服。相對的,我要求你不要自己處理;讓我處理這個學生。

超基本49:
捍衛你的信念。如果你全心全意相信自己的方向沒錯,就不要因為別人的否定而畏縮。

超基本50:
要積極地去享受人生。有些煩惱是很不值得的。看事情要看清大小輕重,要專注生命中美好的一面。

超基本51:
生活要抱著「別讓將來有遺憾」的態度。如果你想要做什麼,那就去做!絕對不要讓恐懼、疑慮或其他阻擋你。如果你想要追求什麼,就全心去追求。是你想做的,就要努力,沒真做到絕不放棄。如果你有什麼夢想,你就要竭盡所能去實現,直到夢想成真。

超基本52:
你是會犯錯的,請接受這個事實。你要從錯誤中學習,並繼續前進。

超基本53:
無論什麼情況,一定要誠實。你做了錯事,最好對我坦白承認,因為我欣賞誠實的人,常會因為你誠實而選擇不給予任何懲罰。

超基本54:
把握今天。今天是不能重來的,所以不要浪費它。生命是由特別的時刻組成的,許多時刻之所以特別,就是因為我們把警戒心拋到腦後,先行動再說,抓住這一天。

超基本55:
在你的能力範圍內,做一個最棒、最棒的人。
大人與小孩之間的互動
孩子需要有所適從,也喜歡有所適從。
如果孩子喜歡你的人,就會努力配合你。
孩子喜歡知道你對他們的期望。
孩子喜歡知道有人在關心他們。

2014年6月24日 星期二

Android Canvas drawText实现中文垂直居中

http://blog.csdn.net/hursing/article/details/18703599


目标:
把中文字符绘制到目标矩形的居中位置。
问题:
Android的Canvas绘图,drawText里的origin是以baseline为基准的,直接以目标矩形的bottom传进drawText,字符位置会偏下。这样写代码:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Override  
  2. public void onDraw (Canvas canvas) {  
  3.     Rect targetRect = new Rect(50501000200);  
  4.     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  5.     paint.setStrokeWidth(3);  
  6.     paint.setTextSize(80);  
  7.     String testString = "测试:ijkJQKA:1234";  
  8.     paint.setColor(Color.CYAN);  
  9.     canvas.drawRect(targetRect, paint);  
  10.     paint.setColor(Color.RED);  
  11.     canvas.drawText(testString, targetRect.left, targetRect.bottom, paint);  
  12. }  
会得到难看的结果:

找方案:
首先自己动手做实验,自己定一个baseline,然后把文字画上去,并对画上FontMetrics的几条线。FontMetrics里是字体图样的信息,有float型int型的版本,都可以从Paint中获取。它的每个成员数值都是以baseline为基准计算的,所以负值表示在baseline之上。实验代码:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Override  
  2. public void onDraw (Canvas canvas) {  
  3.     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  4.     paint.setStrokeWidth(3);  
  5.     paint.setTextSize(80);  
  6.     FontMetricsInt fmi = paint.getFontMetricsInt();  
  7.     String testString = "测试:ijkJQKA:1234";  
  8.     Rect bounds1 = new Rect();  
  9.     paint.getTextBounds("测"01, bounds1);  
  10.     Rect bounds2 = new Rect();  
  11.     paint.getTextBounds("测试:ijk"06, bounds2);  
  12.     // 随意设一个位置作为baseline  
  13.     int x = 200;  
  14.     int y = 400;  
  15.     // 把testString画在baseline上  
  16.     canvas.drawText(testString, x, y, paint);  
  17.     // bounds1  
  18.     paint.setStyle(Style.STROKE);  // 画空心矩形  
  19.     canvas.save();  
  20.     canvas.translate(x, y);  // 注意这里有translate。getTextBounds得到的矩形也是以baseline为基准的  
  21.     paint.setColor(Color.GREEN);          
  22.     canvas.drawRect(bounds1, paint);  
  23.     canvas.restore();  
  24.     // bounds2  
  25.     canvas.save();  
  26.     paint.setColor(Color.MAGENTA);  
  27.     canvas.translate(x, y);  
  28.     canvas.drawRect(bounds2, paint);  
  29.     canvas.restore();  
  30.     // baseline  
  31.     paint.setColor(Color.RED);  
  32.     canvas.drawLine(x, y, 1024, y, paint);  
  33.     // ascent  
  34.     paint.setColor(Color.YELLOW);  
  35.     canvas.drawLine(x, y+fmi.ascent, 1024, y+fmi.ascent, paint);  
  36.     // descent  
  37.     paint.setColor(Color.BLUE);  
  38.     canvas.drawLine(x, y+fmi.descent, 1024, y+fmi.descent, paint);  
  39.     // top  
  40.     paint.setColor(Color.DKGRAY);  
  41.     canvas.drawLine(x, y+fmi.top, 1024, y+fmi.top, paint);  
  42.     // bottom  
  43.     paint.setColor(Color.GREEN);  
  44.     canvas.drawLine(x, y+fmi.bottom, 1024, y+fmi.bottom, paint);  
  45. }  
获得结果:
红线是baseline,最上面的灰线是FontMetrics.top,最下面的绿线是FontMetrics.bottom。(绿色的bottom和蓝色的descent非常接近)
从图中可知,字符本身是在灰线和绿线之间居中的,知道这个就好办了。网上说的使用paint.getTextBounds的方法都不靠谱,可以看到对一个“测”字和6个字得到的bounds是不同的,图中的矩形能很好地表示这个函数得到的是字符的边界,而不是字体的边界。
FontMetrics.top的数值是个负数,其绝对值就是字符绘制边界到baseline的距离。
所以如果是把文字画在 FontMetrics高度的矩形中, drawText就应该传入 -FontMetrics.top。
要画在targetRect的居中位置,baseline的计算公式就是:
targetRect.top + (targetRect.bottom - targetRect.top) / 2 - (FontMetrics.bottom - FontMetrics.top) / 2 - FontMetrics.top
解决:
所以最开始的代码应该改成(顺便加入水平居中):
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Override  
  2. public void onDraw (Canvas canvas) {  
  3.     Rect targetRect = new Rect(50501000200);  
  4.     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  5.     paint.setStrokeWidth(3);  
  6.     paint.setTextSize(80);  
  7.     String testString = "测试:ijkJQKA:1234";  
  8.     paint.setColor(Color.CYAN);  
  9.     canvas.drawRect(targetRect, paint);  
  10.     paint.setColor(Color.RED);  
  11.     FontMetricsInt fontMetrics = paint.getFontMetricsInt();  
  12.         // 转载请注明出处:http://blog.csdn.net/hursing  
  13.     int baseline = targetRect.top + (targetRect.bottom - targetRect.top - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;  
  14.     // 下面这行是实现水平居中,drawText对应改为传入targetRect.centerX()  
  15.     paint.setTextAlign(Paint.Align.CENTER);  
  16.     canvas.drawText(testString, targetRect.centerX(), baseline, paint);  
  17. }  
效果(点击查看大图):

还可以去看看android sdk源码,
$android4.2/frameworks/base/corej/ava/android/text/BoringLayout.java是TextView画文字的算法
转载请注明出处:http://blog.csdn.net/hursing