2012-02-03 1 views
0

@koushによって提供されているGradientTextViewのカスタムクラスはあります(ソースは(github)にあります) 今クラスを取得しましたが、私の知る限り、それはカスタム実行得るためにMainActivityからこのクラスを呼び出す方法にはなくnyways属性を使用することができます理解されるようなアンドロイド に蜂。私は属性セットのパラメータを送信する方法を知らない。それは、このカスタムクラスカスタムクラスGradientTextViewを使用したテキストのアンダーグラウンドグラディエント効果

package android.view; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.LinearGradient; 
import android.graphics.Shader.TileMode; 
import android.text.BoringLayout; 
import android.util.AttributeSet; 
import android.widget.TextView; 

public class GradientTextView extends TextView { 
    public GradientTextView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    int mStartColor = 0; 
    int mEndColor = 0; 
    float mAngle; 
    String mText; 
    BoringLayout mLayout; 

    public GradientTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     int[] ids = new int[attrs.getAttributeCount()]; 
     for (int i = 0; i < attrs.getAttributeCount(); i++) { 
      ids[i] = attrs.getAttributeNameResource(i); 
     } 

     TypedArray a = context.obtainStyledAttributes(attrs, ids, defStyle, 0); 

     for (int i = 0; i < attrs.getAttributeCount(); i++) { 
      String attrName = attrs.getAttributeName(i); 
      if (attrName == null) 
       continue; 

      if (attrName.equals("startColor")) { 
       mStartColor = a.getColor(i, -1); 
      } 
      else if (attrName.equals("endColor")) { 
       mEndColor = a.getColor(i, -1); 
      } 
      else if (attrName.equals("angle")) { 
       mAngle = a.getFloat(i, 0); 
      } 
     } 
    } 

    public static void setGradient(TextView tv, float angle, int startColor, int endColor) { 
     tv.measure(tv.getLayoutParams().width, tv.getLayoutParams().height); 
     LinearGradient gradient = getGradient(tv.getMeasuredWidth(), tv.getMeasuredHeight(), angle, startColor, endColor); 
     tv.getPaint().setShader(gradient); 
    } 

    static LinearGradient getGradient(int measuredWidth, int measuredHeight, float angle, int startColor, int endColor) { 
     // calculate a vector for this angle 
     double rad = Math.toRadians(angle); 
     double oa = Math.tan(rad); 
     double x; 
     double y; 
     if (oa == Double.POSITIVE_INFINITY) { 
      y = 1; 
      x = 0; 
     } 
     else if (oa == Double.NEGATIVE_INFINITY) { 
      y = -1; 
      x = 0; 
     } 
     else { 
      y = oa; 
      if (rad > Math.PI) 
       x = -1; 
      else 
       x = 1; 
     } 

     // using the vector, calculate the start and end points from the center of the box 
     int mx = measuredWidth; 
     int my = measuredHeight; 
     int cx = mx/2; 
     int cy = my/2; 

     double n; 
     if (x == 0) { 
      n = (double)cy/y; 
     } 
     else if (y == 0) { 
      n = (double)cx/x; 
     } 
     else { 
      n = (double)cy/y; 
      double n2 = (double)cx/x; 
      if (Math.abs(n2) < Math.abs(n)) 
       n = n2; 
     } 

     int sx = (int)(cx - n * x); 
     int sy = (int)(cy - n * y); 
     int ex = (int)(cx + n * x); 
     int ey = (int)(cy + n * y); 

     return new LinearGradient(sx, sy, ex, ey, startColor, endColor, TileMode.CLAMP); 
    } 

    protected void onDraw(android.graphics.Canvas canvas) { 
     if (mGradient == null) { 
      mGradient = getGradient(getMeasuredWidth(), getMeasuredHeight(), mAngle, mStartColor, mEndColor); 
      getPaint().setShader(mGradient); 
     } 
     super.onDraw(canvas); 
    } 

    public int getStartColor() { 
     return mStartColor; 
    } 

    public void setStartColor(int startColor) { 
     mStartColor = startColor; 
     invalidate(); 
    } 

    public int getEndColor() { 
     return mEndColor; 
    } 

    public void setEndColor(int endColor) { 
     mEndColor = endColor; 
     invalidate(); 
    } 


    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     mGradient = null; 
    } 
    LinearGradient mGradient; 
} 

あまりにも混乱しますあまりにも混乱していますが、アウトライン、グラデーションなどの調整のために使用されています。フローを理解したいと非常に熱心です

+0

+0

@ Vincent:あなたはそれを詳しく説明できますか?レイアウトのmain.xmlや他の場所でそれを操作する必要がありますか?それを使用する方法を教えてください?ありがとう:-) – user1169079

+0

はい、通常のテキストビューのようにレイアウトのxmlの一部としてこれを使用できますが、パッケージ名とともにクラスの名前を与える必要があります。 –

答えて

1

あなたはビューオブジェクトを使用して/ instanciatingことで、この「表示要素」を使用することができます。

TextView myView = new TextView (this); 
myView.setText("Test"); 
GradientTextView.setGradient(myView, 90, Color.BLACK, Color.WHITE); 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
     Layoutparams.WRAP_CONTENT); 

myLayout.addView(myView, params); 

あなたも、それあなたのレイアウトXMLファイルを使用して、このオブジェクトを使用することができます。

+0

LinearLayout myLayout = new LinearLayout(this); \t \t myLayout.addView(myView、params); 黒の出力が表示されます – user1169079

+1

LinearLayout myLayout = new LinearLayout(this); このコードは、レイアウトパラメータのみを初期化し、すべての値が "0"/"null"に設定されているので、パラメータの幅と高さを定義する必要があります。 – Andreas

+0

上記を実行するとSetGradient行でnull例外が発生します – user1169079

関連する問題