AndroidはCanvasを使って走馬灯を実現



ネット上の多くのチュートリアルでは、TextViewのプロパティを変更してランニングライトのデザインをしています.このようにするには多くの欠点があります.
1、TextViewがフォーカスを取らなければ、ランニングライトの効果は実現できない.
2、テキストの長さがTextViewの幅より小さい場合、ランニングライトの効果は実現できません.
3、多くの属性を設定する必要があります.面倒です.
TextViewを書き換えることでTextViewに焦点を当てるチュートリアルもたくさんありますが、上記のいくつかの問題は解決されていません.
このチュートリアルもTextViewを書き換えることで、正確にはViewを書き換えることでランニングライトを実現します.
使用されるテクノロジー:
1、ペイントの使用;
2、CanvasのdrawText方法;
3、スレッド;
ペイント:私たちの俗称のブラシです.Androidはペイントを設定する方法をたくさん提供しています.
setAntiAlias:ブラシののこぎり効果を設定します.setColor:ブラシの色を設定します.setalGB:ブラシのa,r,p,g値を設定します.setAlpha:Alpha値を設定します.setTextSize:フォントサイズを設定します.setStyle:ブラシスタイル、中空またはソリッドを設定します.setStrokeWidth:中空の枠線幅を設定します.getColor:ブラシの色を取得します.getAlpha:ブラシのAlpha値を取得します. 
Canvas:次の方法があります.
Canvas():空のキャンバスを作成し、setBitmap()メソッドを使用して特定のキャンバスを設定できます.Canvas(Bitmap bitmap):bitmapオブジェクトでキャンバスを作成すると、すべてのコンテンツがbitmapに描画されるため、bitmapはnullにならない.Canvas(GL gl):OpenGLに関連して3 D効果を描画するときに使用します.drawColor:Canvasの背景色を設定します.setBitmap:特定のキャンバスを設定します.clipRect:表示領域を設定します.つまり、トリミング領域を設定します.isOpaque:透明性がサポートされているかどうかを検出します.rotate:キャンバスsetView:キャンバスに表示するウィンドウを設定します.skew:オフセット量を設定します. 
スレッド:この方面の資料は多いです.
コードは次のとおりです.
 
package net.songsoft.paomadeng;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.widget.TextView;
/**
 * <br>
 * CreateDate: 2014-3-25<br>
 * Copyright: Copyright(c)<br>
 * Company: songsoft<br>
 * @author    
 * @version V1.0.0
 * @Description        
 */
public class MarqueeTextView extends TextView implements Runnable {
    private Paint m_paint;
    private int width;
    private String src;    
    /**
     * 
     * @return  src
     * @Description        
     * 2014-3-26::   ::     </br>
     */
    public String getSrc() {
        return src;
    }
    /**
     * 
     * @param src  
     * @Description      
     * 2014-3-26::   ::     </br>
     */
    public void setSrc(String src) {
        this.src = src;
    }
    /**
     * <br>
     * @param context <br>
     * @Description     ,            
     * 2014-3-25::   ::       <br>
     */
    public MarqueeTextView(Context context) {
        super(context);
        width = 320; 
        m_paint = new Paint();
        new Thread(this).start();
    }   
    /**
     * 
     * @param strText
     * @return  
     * @Description           
     * 2014-3-25::   ::     </br>
     */
    Rect GetStringRect(String strText) {
        Rect rect = new Rect();
        m_paint.getTextBounds(strText, 0, strText.length(), rect);
        return rect;
    }    
    /**
     * 
     * @param canvas
     * @param txtStr  
     * @Description       
     * 2014-3-25::   ::     </br>
     */
    void marquee(Canvas canvas, String txtStr) {
        String txtStr2 = txtStr.substring(0, txtStr.length()) ;  
        
        Rect rect = GetStringRect(txtStr);        
        int len = txtStr.length();         
        while((width + rect.width() > 320) && (len > 0))  
        {  
            rect = GetStringRect(txtStr.substring(0, len));  
            len -= 1;  
        }            
        m_paint.setColor(Color.BLACK); 
          
        String txtLeft = txtStr.substring(len, txtStr.length());  
        if (!txtLeft.equals(""))  
        {  
            canvas.drawText(txtLeft,  20, 40, m_paint);          
        }       
          String txtRight = txtStr.substring(0, len);            
        if (!txtRight.equals(""))  
        {  
            canvas.drawText(txtRight, width, 40, m_paint);          
        }
        if(width>20){
            width-=1;
        }else{
            width=320;
        }
    }
    /**
     * 
     * @param canvas
     * @see android.view.View#onDraw(android.graphics.Canvas)
     * @Description    
     * 2014-3-25::   ::     <br>
     */
    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        marquee(canvas, this.getSrc());
    }
    /**
     * 
     * @see java.lang.Runnable#run()
     * @Description    ,    
     * 2014-3-25::   ::     <br>
     */    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(10);
            } catch (Exception e) {
                // TODO: handle exception
                Thread.currentThread().interrupt();
            }
            postInvalidate();
        }
    }
}