GradientDrawable和AttributeSet自定义控件

来源:互联网 发布:俄罗斯社交软件vk 编辑:程序博客网 时间:2024/06/11 05:18

1.自定义控件属性:

<declare-styleable name="ShapeTextview">        <attr name="touchSolidColor" format="color" />        <attr name="solidColor" format="color" />        <attr name="cornesRadius" format="dimension" />        <attr name="topLeftRadius" format="dimension" />        <attr name="topRightRadius" format="dimension" />        <attr name="bottomLeftRadius" format="dimension" />        <attr name="bottomRightRadius" format="dimension" />        <attr name="stroke_Width" format="dimension" />        <attr name="stroke_Color" format="color" />        <attr name="strokeDashWidth" format="dimension" />        <attr name="strokeDashGap" format="dimension" />        <attr name="gradientStartColor" format="color" />        <attr name="gradientEndColor" format="color" />        <attr name="gradientCenterColor" format="color" />        <attr name="gradientUseLevel" format="boolean" />        <attr name="gradientAngle" format="dimension" />        <attr name="gradientOrientation">            <enum name="BL_TR" value="0" />            <enum name="BOTTOM_TOP" value="1" />            <enum name="BR_TL" value="2" />            <enum name="LEFT_RIGHT" value="3" />            <enum name="RIGHT_LEFT" value="4" />            <enum name="TL_BR" value="5" />            <enum name="TOP_BOTTOM" value="6" />            <enum name="TR_BL" value="7" />        </attr>        <attr name="shapeType">            <enum name="LINEAR_GRADIENT" value="0" />            <enum name="OVAL" value="1" />            <enum name="LINE" value="2" />            <enum name="RING" value="3" />        </attr>        <attr name="gradientType">            <enum name="linear" value="0" />            <enum name="radial" value="1" />            <enum name="sweep" value="2" />        </attr>        <attr name="gradientRadius" format="dimension" />    </declare-styleable>


2.控件代码:


1.自定义属性:

package com.klower.component;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Color;import android.graphics.drawable.GradientDrawable;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.TextView;import com.klower.R;public class ShapeTextView extends TextView { int solidColor, stroke_Color, gradientStartColor, gradientEndColor,   gradientCenterColor, touchColor; int cornesRadius, topLeftRadius, topRightRadius, bottomLeftRadius,   bottomRightRadius, stroke_Width, strokeDashWidth, strokeDashGap,   gradientAngle, gradientRadius, gradientType, gradientOrientation, shapeType; boolean gradientUseLevel; GradientDrawable gradientDrawable; public ShapeTextView(Context context, AttributeSet attrs, int defStyle) {  super(context, attrs, defStyle); } public ShapeTextView(Context context, AttributeSet attrs) {  super(context, attrs);  initData(context, attrs); } public ShapeTextView(Context context) {  super(context); } private void initData(Context context, AttributeSet attrs) {  TypedArray a = context.obtainStyledAttributes(attrs,    R.styleable.ShapeTextview);  solidColor = a.getColor(R.styleable.ShapeTextview_solidColor,    Color.TRANSPARENT);  stroke_Color = a.getColor(R.styleable.ShapeTextview_stroke_Color,    Color.TRANSPARENT);  gradientStartColor = a    .getColor(R.styleable.ShapeTextview_gradientStartColor,      Color.TRANSPARENT);  gradientEndColor = a.getColor(    R.styleable.ShapeTextview_gradientEndColor, Color.TRANSPARENT);  gradientCenterColor = a.getColor(    R.styleable.ShapeTextview_gradientCenterColor,    Color.TRANSPARENT);  touchColor = a.getColor(R.styleable.ShapeTextview_touchSolidColor,    Color.TRANSPARENT);  cornesRadius = (int) a.getDimension(    R.styleable.ShapeTextview_cornesRadius, 0);  topLeftRadius = (int) a.getDimension(    R.styleable.ShapeTextview_topLeftRadius, 0);  topRightRadius = (int) a.getDimension(    R.styleable.ShapeTextview_topRightRadius, 0);  bottomLeftRadius = (int) a.getDimension(    R.styleable.ShapeTextview_bottomLeftRadius, 0);  bottomRightRadius = (int) a.getDimension(    R.styleable.ShapeTextview_bottomRightRadius, 0);  stroke_Width = (int) a.getDimension(    R.styleable.ShapeTextview_stroke_Width, 0);  strokeDashWidth = (int) a.getDimension(    R.styleable.ShapeTextview_strokeDashWidth, 0);  strokeDashGap = (int) a.getDimension(    R.styleable.ShapeTextview_strokeDashGap, 0);  gradientAngle = (int) a.getDimension(    R.styleable.ShapeTextview_gradientAngle, 0);  gradientRadius = (int) a.getDimension(    R.styleable.ShapeTextview_gradientRadius, 0);  gradientUseLevel = a.getBoolean(    R.styleable.ShapeTextview_gradientUseLevel, false);  gradientType = a.getInt(R.styleable.ShapeTextview_gradientType, -1);  gradientOrientation = a.getInt(    R.styleable.ShapeTextview_gradientOrientation, -1);  shapeType = a.getInt(    R.styleable.ShapeTextview_shapeType, -1);    gradientDrawable = new GradientDrawable();  gradientDrawable.setStroke(stroke_Width, stroke_Color, strokeDashWidth,    strokeDashGap);  // 如果设定的有Orientation 就默认为是渐变色的Button,否则就是纯色的Button  if (gradientOrientation != -1) {   gradientDrawable     .setOrientation(getOrientation(gradientOrientation));   gradientDrawable.setColors(new int[] { gradientStartColor,     gradientCenterColor, gradientEndColor });  } else {   gradientDrawable.setColor(solidColor);  }    if(shapeType != -1){   gradientDrawable.setShape(shapeType);  }  //是否为圆形  if(shapeType != GradientDrawable.OVAL){   // 如果设定的有Corner Radius就认为是4个角一样的Button, 否则就是4个不一样的角 Button   if (cornesRadius != 0) {    gradientDrawable.setCornerRadius(cornesRadius);   } else {    //1、2两个参数表示左上角,3、4表示右上角,5、6表示右下角,7、8表示左下角    gradientDrawable.setCornerRadii(new float[] { topLeftRadius,      topLeftRadius, topRightRadius, topRightRadius,      bottomRightRadius, bottomRightRadius, bottomLeftRadius,      bottomLeftRadius });   }  }    if (gradientUseLevel)   gradientDrawable.setUseLevel(gradientUseLevel);  if (gradientType != -1)   gradientDrawable.setGradientType(gradientType);  gradientDrawable.setGradientRadius(gradientRadius);  setBackground(gradientDrawable); } @Override public boolean onTouchEvent(MotionEvent event) {  if (event.getAction() == MotionEvent.ACTION_DOWN) {   if (touchColor != Color.TRANSPARENT) {    gradientDrawable.setColor(touchColor);    setBackground(gradientDrawable);    postInvalidate();   }  } else if (event.getAction() == MotionEvent.ACTION_UP    || event.getAction() == MotionEvent.ACTION_CANCEL) {   if (touchColor != Color.TRANSPARENT) {    gradientDrawable.setColor(solidColor);    setBackground(gradientDrawable);   }  }  return super.onTouchEvent(event); } private GradientDrawable.Orientation getOrientation(int gradientOrientation) {  GradientDrawable.Orientation orientation = null;  switch (gradientOrientation) {  case 0:   orientation = GradientDrawable.Orientation.BL_TR;   break;  case 1:   orientation = GradientDrawable.Orientation.BOTTOM_TOP;   break;  case 2:   orientation = GradientDrawable.Orientation.BR_TL;   break;  case 3:   orientation = GradientDrawable.Orientation.LEFT_RIGHT;   break;  case 4:   orientation = GradientDrawable.Orientation.RIGHT_LEFT;   break;  case 5:   orientation = GradientDrawable.Orientation.TL_BR;   break;  case 6:   orientation = GradientDrawable.Orientation.TOP_BOTTOM;   break;  case 7:   orientation = GradientDrawable.Orientation.TR_BL;   break;  }  return orientation; }}

2.系统属性调用:

   public AbsListView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        int[] attrsArray = new int[] { android.R.attr.layout_width, android.R.attr.layout_height };        TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray);        mRootWidth = ta.getDimensionPixelSize(0, ViewGroup.LayoutParams.MATCH_PARENT);        mRootHeight = ta.getDimensionPixelSize(1, ViewGroup.LayoutParams.MATCH_PARENT);        ta.recycle();        init();    }


3.控件使用:

xml 引入控件 加上这句xmlns:flatui="http://schemas.android.com/apk/res-auto"

  <!--                  flatui:strokeDashGap="5dp"                flatui:strokeDashWidth="5dp"                flatui:gradientOrientation = "BOTTOM_TOP"            -->            <com.klower.component.ShapeTextView                android:id="@+id/shapetextview"                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_margin="10dp"                android:gravity="center"                android:padding="5dp"                android:text="ShapeTextview"                android:textSize="25sp"                flatui:bottomLeftRadius="10dp"                flatui:bottomRightRadius="0dp"                flatui:gradientCenterColor="#00000000"                flatui:gradientEndColor="#64DE0E"                flatui:gradientStartColor="#D11B1E"                flatui:solidColor="#64D11C"                flatui:stroke_Color="#D11B1E"                flatui:stroke_Width="2dp"                flatui:topLeftRadius="0dp"                flatui:topRightRadius="10dp"                flatui:touchSolidColor="#F5B2B9" />                        <com.klower.component.ShapeTextView                 flatui:strokeDashGap="5dp"                flatui:strokeDashWidth="5dp"                android:id="@+id/shapetextview1"                android:layout_width="100dp"                android:layout_height="100dp"                android:layout_margin="10dp"                android:gravity="center"                android:padding="5dp"                android:text="ORAL"                android:textSize="25sp"                flatui:gradientCenterColor="#00000000"                flatui:gradientEndColor="#64DE0E"                flatui:gradientStartColor="#D11B1E"                flatui:solidColor="#64D11C"                flatui:stroke_Color="#D11B1E"                flatui:stroke_Width="2dp"                flatui:shapeType = "OVAL"                flatui:touchSolidColor="#F5B2B9" />


4.运行效果:



0 0
原创粉丝点击