2012-02-03 60 views
0

这是由@koush提供的GradientTextView的自定义类(源代码是(github) 现在我得到了类,但是如何调用此类,因为我是新的在Android 蜂据我的理解是可以使用自定义属性,但nyways如何调用从MainActivity这个类来获得运行。我不知道如何发送的AttributeSet参数。这太令人困惑使用自定义类的文本中的ANdroid渐变效果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

2012-02-03 10:36:47

+0

@Vincent:你能详细说明一下吗?我可以在布局的main.xml中操作它,还是可以在其他地方使用它?请告诉我如何使用它?谢谢:-) – user1169079 2012-02-03 12:16:50

+0

是的,你可以像普通的textview一样使用它作为布局的xml的一部分,但是你需要给出类的名字以及包名。 – 2012-02-03 12:38:06

回答

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 2012-02-03 11:11:02

+1

LinearLayout myLayout = new LinearLayout(this); 这个代码只初始化布局参数,所有的值都设置为“0”/“null” - 所以你必须定义参数的宽度和高度 – Andreas 2012-02-03 11:20:33

+0

这样做给我null在SetGradient行异常 – user1169079 2012-02-03 11:29:05