GradientDrawable和AttributeSet自定义控件

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值