diff --git a/README.md b/README.md index 5aecf1d..266ae18 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ ## 2、 效果 [**Demo下载地址**]( https://fir.im/eft1)
-
+
-
-
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/21 + * desc : + *+ */ +class ShadowActivity : AppCompatActivity(), SeekBar.OnSeekBarChangeListener { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_shadow) + setShadowColor() + + shadow_color_alpha_sb.setOnSeekBarChangeListener(this) + + shadow_padding_left_sb.setOnSeekBarChangeListener(this) + shadow_padding_top_sb.setOnSeekBarChangeListener(this) + shadow_padding_right_sb.setOnSeekBarChangeListener(this) + shadow_padding_bottom_sb.setOnSeekBarChangeListener(this) + + shadow_left_top_radius_sb.setOnSeekBarChangeListener(this) + shadow_left_bottom_radius_sb.setOnSeekBarChangeListener(this) + shadow_right_top_radius_sb.setOnSeekBarChangeListener(this) + shadow_right_bottom_radius_sb.setOnSeekBarChangeListener(this) + + shadow_all_radius_sb.setOnSeekBarChangeListener(this) + + shape_view.shadowHelper?.let { + it.setShadowAllRadius(10f) + .setShadowLeftWidth(20f) + .setShadowTopWidth(10f) + .setShadowBottomWidth(20f) + .setShadowRightWidth(10f) + .applyToView() + } + + } + + private fun setShadowColor() { + change_shadow_color_btn.setOnClickListener { + val colorString = shadow_color_et.text.toString() + if (colorString.length == 6 || colorString.length == 8) { + try { + val color = Color.parseColor("#$colorString") + shape_view.shadowHelper?.setShadowColor(color)?.applyToView() + } catch (e: Exception) { + } + } + } + } + + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + + val size = progress.toFloat() + when (seekBar.id) { + R.id.shadow_color_alpha_sb -> { + shape_view.shadowHelper?.setShadowColorAlpha(size / 100) + } + R.id.shadow_padding_left_sb -> { + shape_view.shadowHelper?.setShadowLeftWidth(size) + } + R.id.shadow_padding_top_sb -> { + shape_view.shadowHelper?.setShadowTopWidth(size) + } + R.id.shadow_padding_right_sb -> { + shape_view.shadowHelper?.setShadowRightWidth(size) + } + R.id.shadow_padding_bottom_sb -> { + shape_view.shadowHelper?.setShadowBottomWidth(size) + } + R.id.shadow_left_top_radius_sb -> { + shadow_all_radius_sb.progress = 0 + shape_view.shadowHelper?.setShadowLeftTopRadius(size) + } + R.id.shadow_left_bottom_radius_sb -> { + shadow_all_radius_sb.progress = 0 + shape_view.shadowHelper?.setShadowLeftBottomRadius(size) + } + R.id.shadow_right_top_radius_sb -> { + shadow_all_radius_sb.progress = 0 + shape_view.shadowHelper?.setShadowRightTopRadius(size) + } + R.id.shadow_right_bottom_radius_sb -> { + shadow_all_radius_sb.progress = 0 + shape_view.shadowHelper?.setShadowRightBottomRadius(size) + } + R.id.shadow_all_radius_sb -> { + shadow_left_top_radius_sb.progress = 0 + shadow_left_bottom_radius_sb.progress = 0 + shadow_right_top_radius_sb.progress = 0 + shadow_right_bottom_radius_sb.progress = 0 + shape_view.shadowHelper?.setShadowAllRadius(size) + } + } + shape_view.shadowHelper?.applyToView() + + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/allen/supertextview/ShapeActivity.java b/app/src/main/java/com/allen/supertextview/ShapeActivity.java deleted file mode 100644 index aa4772b..0000000 --- a/app/src/main/java/com/allen/supertextview/ShapeActivity.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.allen.supertextview; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.allen.library.utils.ShapeBuilder; - -/** - *
- * @author : Allen - * e-mail : lygttpod@163.com - * date : 2019/05/31 - * desc : - *- */ -public class ShapeActivity extends AppCompatActivity { - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activiy_shape); - - Button btn = findViewById(R.id.btn); - TextView tv = findViewById(R.id.tv); - View view = findViewById(R.id.view); - LinearLayout linearLayout = findViewById(R.id.ll); - - getColorShape().into(btn); - - getColorShape().into(tv); - - getViewShape().into(view); - - getLinearLayoutShape().into(linearLayout); - - } - - private ShapeBuilder getNormalShape() { - ShapeBuilder shapeBuilder = new ShapeBuilder() - .setShapeType(ShapeBuilder.RECTANGLE) - .setShapeSolidColor(getResources().getColor(R.color.colorAccent)) - .setShapeStrokeColor(getResources().getColor(R.color.colorPrimary)) - .setShapeStrokeWidth(2) - .setShapeCornersRadius(10); - return shapeBuilder; - } - - private ShapeBuilder getColorShape() { - ShapeBuilder shapeBuilder = getNormalShape() - .setShapeUseSelector(true) - .setShapeSelectorNormalColor(getResources().getColor(R.color.colorAccent)) - .setShapeSelectorDisableColor(getResources().getColor(R.color.colorPrimary)) - .setShapeSelectorPressedColor(getResources().getColor(R.color.common_pressed)); - return shapeBuilder; - } - - private ShapeBuilder getLinearLayoutShape() { - ShapeBuilder shapeBuilder = getNormalShape() - .setShapeGradientAngle(45) - .setShapeGradientStartColor(getResources().getColor(R.color.colorAccent)) - .setShapeGradientCenterColor(getResources().getColor(R.color.white)) - .setShapeGradientEndColor(getResources().getColor(R.color.colorPrimary)); - return shapeBuilder; - } - - private ShapeBuilder getViewShape() { - ShapeBuilder shapeBuilder = getNormalShape() - .setShapeGradientAngle(315) - .setShapeGradientCenterY(10) - .setShapeGradientCenterX(10) - .setShapeGradientStartColor(getResources().getColor(R.color.colorAccent)) - .setShapeGradientEndColor(getResources().getColor(R.color.white)); - return shapeBuilder; - } - -} diff --git a/app/src/main/java/com/allen/supertextview/ShapeActivity.kt b/app/src/main/java/com/allen/supertextview/ShapeActivity.kt new file mode 100644 index 0000000..c3614fe --- /dev/null +++ b/app/src/main/java/com/allen/supertextview/ShapeActivity.kt @@ -0,0 +1,49 @@ +package com.allen.supertextview + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.allen.library.helper.ShapeBuilder +import com.allen.library.helper.ShapeType +import kotlinx.android.synthetic.main.activiy_shape.* + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/05/31 + * desc : +* + */ +class ShapeActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activiy_shape) + + shape_text_view.setOnClickListener { + shape_text_view.shapeBuilder?.let { + it.setShapeType(ShapeType.RECTANGLE) + .setShapeSolidColor(resources.getColor(R.color.colorAccent)) + .setShapeStrokeColor(resources.getColor(R.color.colorPrimary)) + .setShapeStrokeWidth(2) + .setShapeCornersRadius(30f) + .into(shape_text_view) + } + } + + } + + /** + * 如果ShapeXXXView无法满足你的布局需求可以,使用ShapeBuilder对任何view设置shape属性 + * 用法如下: + * normalShape.into("你的任意View") + */ + private val normalShape: ShapeBuilder + get() = ShapeBuilder() + .setShapeType(ShapeType.RECTANGLE) + .setShapeSolidColor(resources.getColor(R.color.colorAccent)) + .setShapeStrokeColor(resources.getColor(R.color.colorPrimary)) + .setShapeStrokeWidth(2) + .setShapeCornersRadius(30f) + +} diff --git a/app/src/main/java/com/allen/supertextview/SuperButtonActivity.java b/app/src/main/java/com/allen/supertextview/SuperButtonActivity.java index 2d9b034..f41328a 100644 --- a/app/src/main/java/com/allen/supertextview/SuperButtonActivity.java +++ b/app/src/main/java/com/allen/supertextview/SuperButtonActivity.java @@ -1,7 +1,7 @@ package com.allen.supertextview; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import com.allen.library.SuperButton; diff --git a/app/src/main/java/com/allen/supertextview/TypeActivity.java b/app/src/main/java/com/allen/supertextview/TypeActivity.java index 183f9b2..d3f854b 100644 --- a/app/src/main/java/com/allen/supertextview/TypeActivity.java +++ b/app/src/main/java/com/allen/supertextview/TypeActivity.java @@ -2,11 +2,15 @@ import android.graphics.Color; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.Gravity; import com.allen.library.SuperTextView; -import com.allen.library.utils.ShapeBuilder; +import com.allen.library.helper.ShapeGradientAngle; +import com.allen.library.helper.ShapeBuilder; +import com.allen.library.helper.ShapeGradientType; +import com.allen.library.helper.ShapeType; +import com.allen.library.shape.ShapeLinearLayout; import com.allen.supertextview.utils.DisplayUtils; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.drawable.GlideDrawable; @@ -74,7 +78,7 @@ protected void onCreate(Bundle savedInstanceState) { private void setShape1(SuperTextView stv) { stv .getShapeBuilder() - .setShapeGradientAngle(45) + .setShapeGradientAngle(ShapeGradientAngle.TL_BR) .setShapeGradientStartColor(getResources().getColor(R.color.colorPrimary)) .setShapeGradientEndColor(getResources().getColor(R.color.colorAccent)) .into(stv); @@ -83,13 +87,13 @@ private void setShape1(SuperTextView stv) { private void setShape2(SuperTextView stv) { ShapeBuilder shapeBuilder = new ShapeBuilder(); shapeBuilder - .setShapeType(ShapeBuilder.RECTANGLE) + .setShapeType(ShapeType.RECTANGLE) .setShapeCornersRadius(DisplayUtils.dip2px(this,25f)) .setShapeStrokeWidth(DisplayUtils.dip2px(this,2f)) .setShapeStrokeColor(Color.YELLOW) .setShapeStrokeDashWidth(DisplayUtils.dip2px(this,5f)) .setShapeStrokeDashGap(DisplayUtils.dip2px(this,2f)) - .setShapeGradientAngle(90) + .setShapeGradientAngle(ShapeGradientAngle.TR_BL) .setShapeGradientStartColor(getResources().getColor(R.color.colorPrimary)) .setShapeGradientEndColor(getResources().getColor(R.color.colorAccent)) .into(stv); diff --git a/app/src/main/res/drawable-xxhdpi/icon_iv_bg.png b/app/src/main/res/drawable-xxhdpi/icon_iv_bg.png new file mode 100644 index 0000000..e606417 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_iv_bg.png differ diff --git a/app/src/main/res/drawable/edit_cursor.xml b/app/src/main/res/drawable/edit_cursor.xml new file mode 100644 index 0000000..c530802 --- /dev/null +++ b/app/src/main/res/drawable/edit_cursor.xml @@ -0,0 +1,8 @@ + +
* 超级按钮 实现shape所有的属性 + * + * @deprecated Use {ShapeButton} instead. + * */ +@Deprecated public class SuperButton extends AppCompatButton { private Context mContext; @@ -43,8 +50,8 @@ public class SuperButton extends AppCompatButton { private int sizeHeight; private int gradientAngle; - private int gradientCenterX; - private int gradientCenterY; + private float gradientCenterX; + private float gradientCenterY; private int gradientGradientRadius; private int gradientStartColor; @@ -142,8 +149,8 @@ private void getAttr(AttributeSet attrs) { sizeHeight = typedArray.getDimensionPixelSize(R.styleable.SuperButton_sSizeHeight, dip2px(mContext, 48)); gradientAngle = (int) typedArray.getFloat(R.styleable.SuperButton_sGradientAngle, -1); - gradientCenterX = typedArray.getDimensionPixelSize(R.styleable.SuperButton_sGradientCenterX, 0); - gradientCenterY = typedArray.getDimensionPixelSize(R.styleable.SuperButton_sGradientCenterY, 0); + gradientCenterX = typedArray.getFloat(R.styleable.SuperButton_sGradientCenterX, 0f); + gradientCenterY = typedArray.getFloat(R.styleable.SuperButton_sGradientCenterY, 0f); gradientGradientRadius = typedArray.getDimensionPixelSize(R.styleable.SuperButton_sGradientGradientRadius, 0); gradientStartColor = typedArray.getColor(R.styleable.SuperButton_sGradientStartColor, -1); @@ -162,7 +169,7 @@ private void init() { setClickable(true); shapeBuilder = new ShapeBuilder(); shapeBuilder - .setShapeType(shapeType) + .setShapeType(ShapeType.fromValue(shapeType)) .setShapeCornersRadius(cornersRadius) .setShapeCornersTopLeftRadius(cornersTopLeftRadius) .setShapeCornersTopRightRadius(cornersTopRightRadius) @@ -179,8 +186,8 @@ private void init() { .setShapeSelectorDisableColor(selectorDisableColor) .setShapeSizeWidth(sizeWidth) .setShapeSizeHeight(sizeHeight) - .setShapeGradientType(gradientType) - .setShapeGradientAngle(gradientAngle) + .setShapeGradientType(ShapeGradientType.fromValue(gradientType)) + .setShapeGradientAngle(ShapeGradientAngle.fromValue(gradientAngle)) .setShapeGradientUseLevel(gradientUseLevel) .setShapeGradientCenterX(gradientCenterX) .setShapeGradientCenterY(gradientCenterY) @@ -412,7 +419,7 @@ public SuperButton setShapeSizeHeight(int sizeHeight) { * @return 对象 */ public SuperButton setShapeGradientAngle(int gradientAngle) { - this.shapeBuilder.setShapeGradientAngle(gradientAngle); + this.shapeBuilder.setShapeGradientAngle(ShapeGradientAngle.fromValue(gradientAngle)); return this; } @@ -422,7 +429,7 @@ public SuperButton setShapeGradientAngle(int gradientAngle) { * @param gradientCenterX 中心x * @return 对象 */ - public SuperButton setShapeGradientCenterX(int gradientCenterX) { + public SuperButton setShapeGradientCenterX(float gradientCenterX) { this.shapeBuilder.setShapeGradientCenterX(gradientCenterX); return this; } @@ -433,7 +440,7 @@ public SuperButton setShapeGradientCenterX(int gradientCenterX) { * @param gradientCenterY 中心y * @return 对象 */ - public SuperButton setShapeGradientCenterY(int gradientCenterY) { + public SuperButton setShapeGradientCenterY(float gradientCenterY) { this.shapeBuilder.setShapeGradientCenterY(gradientCenterY); return this; } @@ -488,7 +495,7 @@ public SuperButton setShapeGradientEndColor(int gradientEndColor) { * @param gradientType 类型 * @return 对象 */ - public SuperButton setShapeGradientType(int gradientType) { + public SuperButton setShapeGradientType(ShapeGradientType gradientType) { this.shapeBuilder.setShapeGradientType(gradientType); return this; } diff --git a/library/src/main/java/com/allen/library/SuperTextView.java b/library/src/main/java/com/allen/library/SuperTextView.java index 6215982..16f707b 100644 --- a/library/src/main/java/com/allen/library/SuperTextView.java +++ b/library/src/main/java/com/allen/library/SuperTextView.java @@ -8,19 +8,28 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.os.Build; -import android.support.v7.widget.AppCompatTextView; +import android.text.Editable; import android.text.TextUtils; +import android.text.TextWatcher; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.View; +import android.view.inputmethod.EditorInfo; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.RelativeLayout; -import android.widget.Switch; -import com.allen.library.utils.ShapeBuilder; +import androidx.annotation.DrawableRes; +import androidx.appcompat.widget.AppCompatCheckBox; +import androidx.appcompat.widget.AppCompatEditText; +import androidx.appcompat.widget.AppCompatTextView; +import androidx.appcompat.widget.SwitchCompat; + +import com.allen.library.helper.EditTextHelper; +import com.allen.library.helper.ShapeBuilder; +import com.allen.library.helper.ShapeType; /** * Created by Allen on 2017/7/1. @@ -81,6 +90,9 @@ public class SuperTextView extends RelativeLayout { private ColorStateList mRightTopTextColor; private ColorStateList mRightBottomTextColor; + private ColorStateList mRightEditHintTextColor; + private ColorStateList mRightEditTextColor; + private int mLeftTextSize; private int mLeftTopTextSize; @@ -230,16 +242,18 @@ public class SuperTextView extends RelativeLayout { private OnSwitchCheckedChangeListener switchCheckedChangeListener; private OnCheckBoxCheckedChangeListener checkBoxCheckedChangeListener; + private OnEditTextChangeListener editTextChangeListener; private OnLeftImageViewClickListener leftImageViewClickListener; private OnRightImageViewClickListener rightImageViewClickListener; private static final int TYPE_CHECKBOX = 0; private static final int TYPE_SWITCH = 1; + private static final int TYPE_EDIT = 2; private static int mRightViewType; - private CheckBox rightCheckBox;//右边checkbox + private AppCompatCheckBox rightCheckBox;//右边checkbox private LayoutParams rightCheckBoxParams;//右边checkbox private Drawable rightCheckBoxBg;//checkBox的背景 private int rightCheckBoxMarginRight;//右边checkBox的右边距 @@ -249,14 +263,27 @@ public class SuperTextView extends RelativeLayout { private int centerSpaceHeight;//中间空间的高度 - private Switch mSwitch; + private SwitchCompat mSwitch; private LayoutParams mSwitchParams;//右边switch private int rightSwitchMarginRight; private boolean switchIsChecked = true; + private AppCompatEditText mEditText; + private LayoutParams mEditParams; + private int mEditMinWidth; + private int mEditImeOption; + private int mEditInputType; + private int rightEditMarginRight; + private int editActiveLineColor = -1; + private int mEditTextSize; + private int mEditCusorDrawableRes; + private boolean mEditCusorVisible; + + private String mEditHintText; private String mTextOff; private String mTextOn; + private int mSwitchMinWidth; private int mSwitchPadding; @@ -479,26 +506,44 @@ private void getAttr(AttributeSet attrs) { /////////////////////////////////////////////// mRightViewType = typedArray.getInt(R.styleable.SuperTextView_sRightViewType, -1); //////////////////////////////////////////////// - isChecked = typedArray.getBoolean(R.styleable.SuperTextView_sIsChecked, false); - rightCheckBoxMarginRight = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sRightCheckBoxMarginRight, default_Margin); - rightCheckBoxBg = typedArray.getDrawable(R.styleable.SuperTextView_sRightCheckBoxRes); - ////////////////////////////////////////////////// - rightSwitchMarginRight = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sRightSwitchMarginRight, default_Margin); - switchIsChecked = typedArray.getBoolean(R.styleable.SuperTextView_sSwitchIsChecked, false); - mTextOff = typedArray.getString(R.styleable.SuperTextView_sTextOff); - mTextOn = typedArray.getString(R.styleable.SuperTextView_sTextOn); - - mSwitchMinWidth = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sSwitchMinWidth, 0); - mSwitchPadding = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sSwitchPadding, 0); - mThumbTextPadding = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sThumbTextPadding, 0); - - mThumbResource = typedArray.getDrawable(R.styleable.SuperTextView_sThumbResource); - mTrackResource = typedArray.getDrawable(R.styleable.SuperTextView_sTrackResource); + switch (mRightViewType){ + case TYPE_CHECKBOX:{ + isChecked = typedArray.getBoolean(R.styleable.SuperTextView_sIsChecked, false); + rightCheckBoxMarginRight = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sRightCheckBoxMarginRight, default_Margin); + rightCheckBoxBg = typedArray.getDrawable(R.styleable.SuperTextView_sRightCheckBoxRes); + }break; + case TYPE_SWITCH:{ + rightSwitchMarginRight = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sRightSwitchMarginRight, default_Margin); + switchIsChecked = typedArray.getBoolean(R.styleable.SuperTextView_sSwitchIsChecked, false); + mTextOff = typedArray.getString(R.styleable.SuperTextView_sTextOff); + mTextOn = typedArray.getString(R.styleable.SuperTextView_sTextOn); + + mSwitchMinWidth = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sSwitchMinWidth, 0); + mSwitchPadding = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sSwitchPadding, 0); + mThumbTextPadding = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sThumbTextPadding, 0); + + mThumbResource = typedArray.getDrawable(R.styleable.SuperTextView_sThumbResource); + mTrackResource = typedArray.getDrawable(R.styleable.SuperTextView_sTrackResource); + }break; + case TYPE_EDIT:{ + rightEditMarginRight = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sEditMarginRight, 0); + mEditMinWidth = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sEditMinWidth, 0); + mEditImeOption = typedArray.getInt(R.styleable.SuperTextView_android_imeOptions, EditorInfo.IME_NULL); + mEditInputType = typedArray.getInt(R.styleable.SuperTextView_android_inputType, EditorInfo.TYPE_NULL); + mRightEditTextColor = typedArray.getColorStateList(R.styleable.SuperTextView_sEditTextColor); + mRightEditHintTextColor = typedArray.getColorStateList(R.styleable.SuperTextView_sEditHintTextColor); + mEditHintText = typedArray.getString(R.styleable.SuperTextView_sEditHint); + editActiveLineColor = typedArray.getColor(R.styleable.SuperTextView_sEditActiveLineColor, editActiveLineColor); + mEditTextSize = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sEditTextSize, defaultSize); + mEditCusorDrawableRes = typedArray.getResourceId(R.styleable.SuperTextView_sEditCursorDrawable,0); + mEditCusorVisible = typedArray.getBoolean(R.styleable.SuperTextView_sEditCursorVisible,true); + }break; + } centerSpaceHeight = typedArray.getDimensionPixelSize(R.styleable.SuperTextView_sCenterSpaceHeight, dip2px(mContext, 5)); //////////////////////////////////////////////////// - selectorPressedColor = typedArray.getColor(R.styleable.SuperTextView_sShapeSelectorPressedColor, defaultShapeColor); - selectorNormalColor = typedArray.getColor(R.styleable.SuperTextView_sShapeSelectorNormalColor, defaultShapeColor); + selectorPressedColor = typedArray.getColor(R.styleable.SuperTextView_sShapeSelectorPressedColor, -1); + selectorNormalColor = typedArray.getColor(R.styleable.SuperTextView_sShapeSelectorNormalColor, -1); solidColor = typedArray.getColor(R.styleable.SuperTextView_sShapeSolidColor, defaultShapeColor); @@ -518,6 +563,7 @@ private void getAttr(AttributeSet attrs) { mLeftIconShowCircle = typedArray.getBoolean(R.styleable.SuperTextView_sLeftIconShowCircle, false); mRightIconShowCircle = typedArray.getBoolean(R.styleable.SuperTextView_sRightIconShowCircle, false); + typedArray.recycle(); } @@ -555,16 +601,22 @@ private void initView() { initRightIcon(); + if(mRightViewType == TYPE_EDIT){ + initRightEditText(); + } + initLeftTextView(); initCenterTextView(); initRightTextView(); } + + private void initShape() { if (useShape) { shapeBuilder - .setShapeType(ShapeBuilder.RECTANGLE) + .setShapeType(ShapeType.RECTANGLE) .setShapeCornersRadius(cornersRadius) .setShapeCornersTopLeftRadius(cornersTopLeftRadius) .setShapeCornersTopRightRadius(cornersTopRightRadius) @@ -575,7 +627,7 @@ private void initShape() { .setShapeStrokeWidth(strokeWidth) .setShapeStrokeDashWidth(strokeDashWidth) .setShapeStrokeDashGap(strokeDashGap) - .setShapeUseSelector(true) + .setShapeUseSelector(selectorNormalColor != -1 || selectorPressedColor != -1) .setShapeSelectorNormalColor(selectorNormalColor) .setShapeSelectorPressedColor(selectorPressedColor) .into(this); @@ -832,7 +884,7 @@ private void initRightTextView() { */ private void initRightCheckBox() { if (rightCheckBox == null) { - rightCheckBox = new CheckBox(mContext); + rightCheckBox = new AppCompatCheckBox(mContext); } rightCheckBoxParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); @@ -862,7 +914,7 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { */ private void initRightSwitch() { if (mSwitch == null) { - mSwitch = new Switch(mContext); + mSwitch = new SwitchCompat(mContext); } mSwitchParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); @@ -875,9 +927,11 @@ private void initRightSwitch() { mSwitch.setChecked(switchIsChecked); if (!TextUtils.isEmpty(mTextOff)) { mSwitch.setTextOff(mTextOff); + mSwitch.setShowText(true); } if (!TextUtils.isEmpty(mTextOn)) { mSwitch.setTextOn(mTextOn); + mSwitch.setShowText(true); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { @@ -910,6 +964,93 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { addView(mSwitch); } + + private void initRightEditText() { + + if (mEditText == null) { + mEditText = new AppCompatEditText(mContext); + mEditText.setSingleLine(true); + mEditText.setGravity(Gravity.END); + mEditText.setImeOptions(mEditImeOption); + mEditText.setInputType(mEditInputType); + mEditText.setBackgroundDrawable(null); + mEditText.setTextSize(TypedValue.COMPLEX_UNIT_PX,mEditTextSize); + mEditText.setCursorVisible(mEditCusorVisible); + //setFocusable(true); + //setFocusableInTouchMode(true); + EditTextHelper.INSTANCE.setCursorDrawable(mEditText,mEditCusorDrawableRes); + } + + if(mRightEditHintTextColor!=null){ + mEditText.setHintTextColor(mRightEditHintTextColor); + } + if(mRightEditTextColor!=null){ + mEditText.setTextColor(mRightEditTextColor); + } + if(mEditHintText!=null){ + mEditText.setHint(mEditHintText); + } + + if(mEditMinWidth==0){ + mEditParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + }else{ + mEditText.setMinWidth(mEditMinWidth); + mEditParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + } + + + mEditParams.addRule(RelativeLayout.LEFT_OF, R.id.sRightImgId); + mEditParams.addRule(RelativeLayout.CENTER_VERTICAL, TRUE); + mEditParams.setMargins(0, 0, rightEditMarginRight, 0); + mEditText.setId(R.id.sRightEditTextId); + mEditText.setLayoutParams(mEditParams); + + addView(mEditText); + //setFocusable(false); + //setFocusableInTouchMode(false); + + mEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + if (editTextChangeListener != null) { + editTextChangeListener.beforeTextChanged(s,start,count,after); + } + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (editTextChangeListener != null) { + editTextChangeListener.onTextChanged(s,start,before,count); + } + } + + @Override + public void afterTextChanged(Editable s) { + if (editTextChangeListener != null) { + editTextChangeListener.afterTextChanged(s); + } + } + }); + + + + if(editActiveLineColor!=-1){ + mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if(hasFocus){ + setBottomDividerLineColor(editActiveLineColor); + }else{ + setBottomDividerLineColor(mDividerLineColor); + } + } + }); + } + + + + } + /////////////////////////////////////默认属性设置----begin///////////////////////////////// /** @@ -1946,10 +2087,92 @@ public boolean getSwitchIsChecked() { * * @return Switch */ - public Switch getSwitch() { + public SwitchCompat getSwitch() { return mSwitch; } + /** + * 获取Edittext View + * + * @return AppCompatEditText + */ + public AppCompatEditText getEditText(){ + return mEditText; + } + + public SuperTextView setEditImeOptions(int option){ + if (mEditText != null) { + mEditText.setImeOptions(option); + } + return this; + } + + public SuperTextView setEditInputType(int inputType){ + if (mEditText != null) { + mEditText.setInputType(inputType); + } + return this; + } + + public SuperTextView setEditHintText(String hintText){ + if (mEditText != null) { + mEditText.setHint(hintText); + } + return this; + } + + + public SuperTextView setEditHintTextColor(int color){ + if (mEditText != null) { + setEditHintTextColor(ColorStateList.valueOf(color)); + } + return this; + } + + public SuperTextView setEditHintTextColor(ColorStateList color){ + if (mEditText != null) { + if (color == null) { + throw new NullPointerException(); + } + mEditText.setHintTextColor(color); + } + return this; + } + + + public SuperTextView setEditTextColor(int color){ + if (mEditText != null) { + setEditTextColor(ColorStateList.valueOf(color)); + } + return this; + } + + public SuperTextView setEditTextColor(ColorStateList color){ + if (mEditText != null) { + if (color == null) { + throw new NullPointerException(); + } + mEditText.setTextColor(color); + } + return this; + } + + public SuperTextView setEditCursorVisible(boolean visible){ + if (mEditText != null) { + mEditText.setCursorVisible(visible); + } + return this; + } + + + public SuperTextView setEditCursorDrawableRes(@DrawableRes int drawableRes){ + if (mEditText != null) { + EditTextHelper.INSTANCE.setCursorDrawable(mEditText,drawableRes); + } + return this; + } + + /** * 设置左边tv的左侧图片 * @@ -2373,6 +2596,11 @@ public SuperTextView setCheckBoxCheckedChangeListener(OnCheckBoxCheckedChangeLis return this; } + public SuperTextView setEditTextChangeListener(OnEditTextChangeListener editTextChangeListener) { + this.editTextChangeListener = editTextChangeListener; + return this; + } + public SuperTextView setLeftTextGroupClickListener(final OnLeftTextGroupClickListener leftTextGroupClickListener) { if (leftTextGroupClickListener != null) { leftView.setOnClickListener(new OnClickListener() { @@ -2466,6 +2694,15 @@ public interface OnCheckBoxCheckedChangeListener { void onCheckedChanged(CompoundButton buttonView, boolean isChecked); } + public interface OnEditTextChangeListener{ + + void beforeTextChanged(CharSequence s, int start, int count, int after); + + void onTextChanged(CharSequence s, int start, int before, int count); + + void afterTextChanged(Editable s); + } + public interface OnLeftTextGroupClickListener { void onClickListener(View view); } @@ -2513,4 +2750,4 @@ private int dip2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } -} +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/data/AttributeSetData.kt b/library/src/main/java/com/allen/library/data/AttributeSetData.kt new file mode 100644 index 0000000..21dbcbe --- /dev/null +++ b/library/src/main/java/com/allen/library/data/AttributeSetData.kt @@ -0,0 +1,61 @@ +package com.allen.library.data + +import android.graphics.Color + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/22 + * desc : + *+ */ +class AttributeSetData { + var shapeType = -1 + var solidColor = -1 + + var strokeWidth = -1 + var strokeColor = -1 + var strokeDashWidth = 0.0f + var strokeDashGap = 0.0f + + var cornersRadius = 0.0f + var cornersTopLeftRadius = 0.0f + var cornersTopRightRadius = 0.0f + var cornersBottomLeftRadius = 0.0f + var cornersBottomRightRadius = 0.0f + + var gradientAngle = -1 + var gradientCenterX: Float = 0f + var gradientCenterY: Float = 0f + var gradientGradientRadius: Int = 0 + var gradientStartColor = -1 + var gradientCenterColor = -1 + var gradientEndColor = -1 + var gradientType: Int = 0 + var gradientUseLevel: Boolean = false + + var sizeWidth = -1 + var sizeHeight = -1 + + var selectorPressedColor: Int = 0 + var selectorDisableColor: Int = 0 + var selectorNormalColor: Int = 0 + + var useSelector: Boolean = false + + //////////阴影相关//////// + var showShadow: Boolean = false + var shadowColor: Int = Color.GRAY + var shadowColorAlpha: Float = 0.2f + var shadowLeftWidth: Float = 0f + var shadowTopWidth: Float = 0f + var shadowRightWidth: Float = 0f + var shadowBottomWidth: Float = 0f + + var shadowCornersRadius: Float = 0f + var shadowCornersTopLeftRadius: Float = 0f + var shadowCornersTopRightRadius: Float = 0f + var shadowCornersBottomLeftRadius: Float = 0f + var shadowCornersBottomRightRadius: Float = 0f +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/helper/AttributeSetHelper.kt b/library/src/main/java/com/allen/library/helper/AttributeSetHelper.kt new file mode 100644 index 0000000..9130b90 --- /dev/null +++ b/library/src/main/java/com/allen/library/helper/AttributeSetHelper.kt @@ -0,0 +1,98 @@ +package com.allen.library.helper + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.util.AttributeSet +import com.allen.library.R +import com.allen.library.data.AttributeSetData + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/09 + * desc : + *+ */ +class AttributeSetHelper { + + private val defaultColor = 0xffffff + private val defaultSelectorColor = 0x20000000 + + fun loadFromAttributeSet(context: Context, attrs: AttributeSet?): AttributeSetData { + val attributeSetData = AttributeSetData() + + if (attrs == null) return attributeSetData + + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ShapeView) + + attributeSetData.shapeType = typedArray.getInt(R.styleable.ShapeView_shapeType, GradientDrawable.RECTANGLE) + + attributeSetData.solidColor = typedArray.getColor(R.styleable.ShapeView_shapeSolidColor, defaultColor) + + attributeSetData.selectorPressedColor = typedArray.getColor(R.styleable.ShapeView_shapeSelectorPressedColor, defaultSelectorColor) + attributeSetData.selectorDisableColor = typedArray.getColor(R.styleable.ShapeView_shapeSelectorDisableColor, defaultSelectorColor) + attributeSetData.selectorNormalColor = typedArray.getColor(R.styleable.ShapeView_shapeSelectorNormalColor, defaultSelectorColor) + + attributeSetData.cornersRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeCornersRadius, 0).toFloat() + attributeSetData.cornersTopLeftRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeCornersTopLeftRadius, 0).toFloat() + attributeSetData.cornersTopRightRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeCornersTopRightRadius, 0).toFloat() + attributeSetData.cornersBottomLeftRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeCornersBottomLeftRadius, 0).toFloat() + attributeSetData.cornersBottomRightRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeCornersBottomRightRadius, 0).toFloat() + + attributeSetData.strokeWidth = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeStrokeWidth, 0) + attributeSetData.strokeDashWidth = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeStrokeDashWidth, 0).toFloat() + attributeSetData.strokeDashGap = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeStrokeDashGap, 0).toFloat() + + attributeSetData.strokeColor = typedArray.getColor(R.styleable.ShapeView_shapeStrokeColor, defaultColor) + + attributeSetData.sizeWidth = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeSizeWidth, 0) + attributeSetData.sizeHeight = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeSizeHeight, dip2px(context, 48f)) + + attributeSetData.gradientAngle = typedArray.getFloat(R.styleable.ShapeView_shapeGradientAngle, -1f).toInt() + attributeSetData.gradientCenterX = typedArray.getFloat(R.styleable.ShapeView_shapeGradientCenterX, 0f) + attributeSetData.gradientCenterY = typedArray.getFloat(R.styleable.ShapeView_shapeGradientCenterY, 0f) + attributeSetData.gradientGradientRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shapeGradientGradientRadius, 0) + + attributeSetData.gradientStartColor = typedArray.getColor(R.styleable.ShapeView_shapeGradientStartColor, -1) + attributeSetData.gradientCenterColor = typedArray.getColor(R.styleable.ShapeView_shapeGradientCenterColor, -1) + attributeSetData.gradientEndColor = typedArray.getColor(R.styleable.ShapeView_shapeGradientEndColor, -1) + + attributeSetData.gradientType = typedArray.getInt(R.styleable.ShapeView_shapeGradientType, 0) + attributeSetData.gradientUseLevel = typedArray.getBoolean(R.styleable.ShapeView_shapeGradientUseLevel, false) + + attributeSetData.useSelector = typedArray.getBoolean(R.styleable.ShapeView_shapeUseSelector, false) + + + attributeSetData.showShadow = typedArray.getBoolean(R.styleable.ShapeView_showShadow, false) + attributeSetData.shadowColor = typedArray.getColor(R.styleable.ShapeView_shadowColor, Color.GRAY) + attributeSetData.shadowColorAlpha = typedArray.getFloat(R.styleable.ShapeView_shadowColorAlpha, 0.2f) + attributeSetData.shadowLeftWidth = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowLeftWidth, 0).toFloat() + attributeSetData.shadowTopWidth = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowTopWidth, 0).toFloat() + attributeSetData.shadowRightWidth = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowRightWidth, 0).toFloat() + attributeSetData.shadowBottomWidth = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowBottomWidth, 0).toFloat() + attributeSetData.shadowCornersRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowCornersRadius, 0).toFloat() + attributeSetData.shadowCornersTopLeftRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowCornersTopLeftRadius, 0).toFloat() + attributeSetData.shadowCornersTopRightRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowCornersTopRightRadius, 0).toFloat() + attributeSetData.shadowCornersBottomLeftRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowCornersBottomLeftRadius, 0).toFloat() + attributeSetData.shadowCornersBottomRightRadius = typedArray.getDimensionPixelSize(R.styleable.ShapeView_shadowCornersBottomRightRadius, 0).toFloat() + + typedArray.recycle() + + return attributeSetData + } + + + /** + * 单位转换工具类 + * + * @param context 上下文对象 + * @param dipValue 值 + * @return 返回值 + */ + private fun dip2px(context: Context, dipValue: Float): Int { + val scale = context.resources.displayMetrics.density + return (dipValue * scale + 0.5f).toInt() + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/helper/EditTextHelper.kt b/library/src/main/java/com/allen/library/helper/EditTextHelper.kt new file mode 100644 index 0000000..9cb5c39 --- /dev/null +++ b/library/src/main/java/com/allen/library/helper/EditTextHelper.kt @@ -0,0 +1,32 @@ +package com.allen.library.helper + +import android.R +import android.annotation.TargetApi +import android.os.Build +import android.widget.EditText +import android.widget.TextView +import androidx.annotation.DrawableRes +import java.lang.reflect.Field + + +/** + * @name SuperTextView + * @author Realmo + * @email momo.weiye@gmail.com + * @version 1.0.0 + * @time 2020/12/14 10:27 + * @describe + */ +object EditTextHelper { + + @TargetApi(Build.VERSION_CODES.O) + fun setCursorDrawable(editText:EditText,@DrawableRes drawableRes:Int){ + try { //修改光标的颜色(反射) + val f: Field = TextView::class.java.getDeclaredField("mCursorDrawableRes") + f.setAccessible(true) + f.set(editText, drawableRes) + } catch (e: Exception) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/helper/ShadowHelper.kt b/library/src/main/java/com/allen/library/helper/ShadowHelper.kt new file mode 100644 index 0000000..1717e24 --- /dev/null +++ b/library/src/main/java/com/allen/library/helper/ShadowHelper.kt @@ -0,0 +1,347 @@ +package com.allen.library.helper + +import android.graphics.* +import android.view.View +import com.allen.library.data.AttributeSetData +import kotlin.math.min + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/22 + * desc : + *+ */ +class ShadowHelper { + + private var targetView: View? = null + + var attributeSetData: AttributeSetData = AttributeSetData() + + private var width: Int = 0 + private var height: Int = 0 + + private var cornersPathList: MutableList
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/05/27 + * desc : shape构造器 +* + */ + +enum class ShapeType(val value: Int) { + RECTANGLE(0), + OVAL(1), + LINE(2), + RING(3); + + companion object { + @JvmStatic + fun fromValue(value: Int): ShapeType { + return values().find { it.value == value } ?: RECTANGLE + } + } +} + +enum class ShapeGradientAngle(val value: Int) { + LEFT_RIGHT(0), + BL_TR(45), + BOTTOM_TOP(90), + BR_TL(135), + RIGHT_LEFT(180), + TR_BL(225), + TOP_BOTTOM(270), + TL_BR(315); + + companion object { + @JvmStatic + fun fromValue(value: Int): ShapeGradientAngle { + return values().find { it.value == value } ?: LEFT_RIGHT + } + } +} + +enum class ShapeGradientType(val value: Int) { + LINEAR(0), + RADIAL(1), + SWEEP(2); + + companion object { + @JvmStatic + fun fromValue(value: Int): ShapeGradientType { + return values().find { it.value == value } ?: LINEAR + } + } +} + +class ShapeBuilder { + + /** + * android:shape=["rectangle" | "oval" | "line" | "ring"] + */ + private var shapeType: ShapeType = ShapeType.RECTANGLE + + /** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/09 + * desc : + *+ */ +class ShapeButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : AppCompatButton(context, attrs, defStyleAttr) { + var shapeBuilder: ShapeBuilder? = null + var attributeSetData: AttributeSetData = AttributeSetData() + + init { + attributeSetData = AttributeSetHelper().loadFromAttributeSet(context, attrs) + shapeBuilder = ShapeBuilder() + shapeBuilder?.init(this, attributeSetData) + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/shape/ShapeCardView.kt b/library/src/main/java/com/allen/library/shape/ShapeCardView.kt new file mode 100644 index 0000000..4840911 --- /dev/null +++ b/library/src/main/java/com/allen/library/shape/ShapeCardView.kt @@ -0,0 +1,27 @@ +package com.allen.library.shape + +import android.content.Context +import androidx.cardview.widget.CardView +import android.util.AttributeSet +import com.allen.library.data.AttributeSetData +import com.allen.library.helper.AttributeSetHelper +import com.allen.library.helper.ShapeBuilder + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/09 + * desc : + *+ */ +class ShapeCardView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : androidx.cardview.widget.CardView(context, attrs, defStyleAttr) { + var shapeBuilder: ShapeBuilder? = null + var attributeSetData: AttributeSetData = AttributeSetData() + + init { + attributeSetData = AttributeSetHelper().loadFromAttributeSet(context, attrs) + shapeBuilder = ShapeBuilder() + shapeBuilder?.init(this, attributeSetData) + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/shape/ShapeConstraintLayout.kt b/library/src/main/java/com/allen/library/shape/ShapeConstraintLayout.kt new file mode 100644 index 0000000..cd87b94 --- /dev/null +++ b/library/src/main/java/com/allen/library/shape/ShapeConstraintLayout.kt @@ -0,0 +1,47 @@ +package com.allen.library.shape + +import android.content.Context +import android.graphics.Canvas +import androidx.constraintlayout.widget.ConstraintLayout +import android.util.AttributeSet +import com.allen.library.data.AttributeSetData +import com.allen.library.helper.AttributeSetHelper +import com.allen.library.helper.ShadowHelper +import com.allen.library.helper.ShapeBuilder + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/09 + * desc : + *+ */ +class ShapeConstraintLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : ConstraintLayout(context, attrs, defStyleAttr) { + var shapeBuilder: ShapeBuilder? = null + var shadowHelper: ShadowHelper? = null + + var attributeSetData: AttributeSetData = AttributeSetData() + + init { + attributeSetData = AttributeSetHelper().loadFromAttributeSet(context, attrs) + if (attributeSetData.showShadow) { + shadowHelper = ShadowHelper() + shadowHelper?.init(this, attributeSetData) + } else { + shapeBuilder = ShapeBuilder() + shapeBuilder?.init(this, attributeSetData) + } + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + shadowHelper?.onSizeChanged(w, h) + } + + override fun dispatchDraw(canvas: Canvas) { + shadowHelper?.drawBefore(canvas) + super.dispatchDraw(canvas) + shadowHelper?.drawOver(canvas) + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/shape/ShapeFrameLayout.kt b/library/src/main/java/com/allen/library/shape/ShapeFrameLayout.kt new file mode 100644 index 0000000..9d6b061 --- /dev/null +++ b/library/src/main/java/com/allen/library/shape/ShapeFrameLayout.kt @@ -0,0 +1,47 @@ +package com.allen.library.shape + +import android.content.Context +import android.graphics.Canvas +import android.util.AttributeSet +import android.widget.FrameLayout +import com.allen.library.data.AttributeSetData +import com.allen.library.helper.AttributeSetHelper +import com.allen.library.helper.ShadowHelper +import com.allen.library.helper.ShapeBuilder + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/09 + * desc : + *+ */ +class ShapeFrameLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr) { + var shapeBuilder: ShapeBuilder? = null + var shadowHelper: ShadowHelper? = null + + var attributeSetData: AttributeSetData = AttributeSetData() + + init { + attributeSetData = AttributeSetHelper().loadFromAttributeSet(context, attrs) + if (attributeSetData.showShadow) { + shadowHelper = ShadowHelper() + shadowHelper?.init(this, attributeSetData) + } else { + shapeBuilder = ShapeBuilder() + shapeBuilder?.init(this, attributeSetData) + } + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + shadowHelper?.onSizeChanged(w, h) + } + + override fun dispatchDraw(canvas: Canvas) { + shadowHelper?.drawBefore(canvas) + super.dispatchDraw(canvas) + shadowHelper?.drawOver(canvas) + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/shape/ShapeLinearLayout.kt b/library/src/main/java/com/allen/library/shape/ShapeLinearLayout.kt new file mode 100644 index 0000000..17c369e --- /dev/null +++ b/library/src/main/java/com/allen/library/shape/ShapeLinearLayout.kt @@ -0,0 +1,47 @@ +package com.allen.library.shape + +import android.content.Context +import android.graphics.Canvas +import android.util.AttributeSet +import android.widget.LinearLayout +import com.allen.library.data.AttributeSetData +import com.allen.library.helper.AttributeSetHelper +import com.allen.library.helper.ShadowHelper +import com.allen.library.helper.ShapeBuilder + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/09 + * desc : + *+ */ +class ShapeLinearLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : LinearLayout(context, attrs, defStyleAttr) { + var shapeBuilder: ShapeBuilder? = null + var shadowHelper: ShadowHelper? = null + + var attributeSetData: AttributeSetData = AttributeSetData() + + init { + attributeSetData = AttributeSetHelper().loadFromAttributeSet(context, attrs) + if (attributeSetData.showShadow) { + shadowHelper = ShadowHelper() + shadowHelper?.init(this, attributeSetData) + } else { + shapeBuilder = ShapeBuilder() + shapeBuilder?.init(this, attributeSetData) + } + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + shadowHelper?.onSizeChanged(w, h) + } + + override fun dispatchDraw(canvas: Canvas) { + shadowHelper?.drawBefore(canvas) + super.dispatchDraw(canvas) + shadowHelper?.drawOver(canvas) + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/shape/ShapeRelativeLayout.kt b/library/src/main/java/com/allen/library/shape/ShapeRelativeLayout.kt new file mode 100644 index 0000000..06fe4e5 --- /dev/null +++ b/library/src/main/java/com/allen/library/shape/ShapeRelativeLayout.kt @@ -0,0 +1,47 @@ +package com.allen.library.shape + +import android.content.Context +import android.graphics.Canvas +import android.util.AttributeSet +import android.widget.RelativeLayout +import com.allen.library.data.AttributeSetData +import com.allen.library.helper.AttributeSetHelper +import com.allen.library.helper.ShadowHelper +import com.allen.library.helper.ShapeBuilder + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/09 + * desc : + *+ */ +class ShapeRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : RelativeLayout(context, attrs, defStyleAttr) { + var shapeBuilder: ShapeBuilder? = null + var shadowHelper: ShadowHelper? = null + + var attributeSetData: AttributeSetData = AttributeSetData() + + init { + attributeSetData = AttributeSetHelper().loadFromAttributeSet(context, attrs) + if (attributeSetData.showShadow) { + shadowHelper = ShadowHelper() + shadowHelper?.init(this, attributeSetData) + } else { + shapeBuilder = ShapeBuilder() + shapeBuilder?.init(this, attributeSetData) + } + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + shadowHelper?.onSizeChanged(w, h) + } + + override fun dispatchDraw(canvas: Canvas) { + shadowHelper?.drawBefore(canvas) + super.dispatchDraw(canvas) + shadowHelper?.drawOver(canvas) + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/shape/ShapeTextView.kt b/library/src/main/java/com/allen/library/shape/ShapeTextView.kt new file mode 100644 index 0000000..eb1b7d3 --- /dev/null +++ b/library/src/main/java/com/allen/library/shape/ShapeTextView.kt @@ -0,0 +1,27 @@ +package com.allen.library.shape + +import android.content.Context +import androidx.appcompat.widget.AppCompatTextView +import android.util.AttributeSet +import com.allen.library.data.AttributeSetData +import com.allen.library.helper.AttributeSetHelper +import com.allen.library.helper.ShapeBuilder + +/** + *
+ * @author : Allen + * e-mail : lygttpod@163.com + * date : 2019/09/09 + * desc : + *+ */ +class ShapeTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : AppCompatTextView(context, attrs, defStyleAttr) { + var shapeBuilder: ShapeBuilder? = null + var attributeSetData: AttributeSetData = AttributeSetData() + + init { + attributeSetData = AttributeSetHelper().loadFromAttributeSet(context, attrs) + shapeBuilder = ShapeBuilder() + shapeBuilder?.init(this, attributeSetData) + } +} \ No newline at end of file diff --git a/library/src/main/java/com/allen/library/utils/ShapeBuilder.java b/library/src/main/java/com/allen/library/utils/ShapeBuilder.java deleted file mode 100644 index 4688fc4..0000000 --- a/library/src/main/java/com/allen/library/utils/ShapeBuilder.java +++ /dev/null @@ -1,486 +0,0 @@ -package com.allen.library.utils; - -import android.content.Context; -import android.graphics.drawable.GradientDrawable; -import android.graphics.drawable.StateListDrawable; -import android.os.Build; -import android.view.View; - -/** - *
- * @author : Allen - * e-mail : lygttpod@163.com - * date : 2019/05/27 - * desc : shape构造器 - *- */ -public class ShapeBuilder { - - /** - * shape的样式 - */ - public static final int RECTANGLE = 0; - public static final int OVAL = 1; - public static final int LINE = 2; - public static final int RING = 3; - - /** - * android:shape=["rectangle" | "oval" | "line" | "ring"] - */ - private int shapeType = -1; - - /** - *