Android 魔術字型按鈕(高亮,陰影效果)
阿新 • • 發佈:2018-12-14
效果如下,封裝記錄原始碼:
double_arrow.png 圖示資源
介面:
<LinearLayout android:layout_marginTop="20dp" android:layout_gravity="right" android:id="@+id/lin_jump" android:layout_width="150dp" android:layout_height="50dp" android:gravity="center" android:layout_marginRight="100dp" android:orientation="horizontal"> <com.xiaoluobei.policecar.view.view.ShineTextView xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_gravity="center" android:gravity="center" android:padding="10dp" android:text="跳 過" android:textColor="@color/white" android:textSize="18sp" app:bgShadowColor="@color/blue" app:bgShadowDy="1" app:bgShadowRadius="12" app:outerShadowColor="@color/blue" app:outerShadowDy="1" app:outerShadowRadius="12" /> <ImageView android:layout_width="20dp" android:layout_height="15dp" android:background="@mipmap/double_arrow" /> </LinearLayout>
ShineTextView :
@SuppressLint("AppCompatCustomView") public class ShineTextView extends TextView { private ArrayList<Shadow> outerShadows; public ShineTextView(Context context) { super(context); init(null); } public ShineTextView(Context context, AttributeSet attrs) { super(context, attrs); init(attrs); } public ShineTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(attrs); } public void init(AttributeSet attrs) { outerShadows = new ArrayList<Shadow>(); if (attrs != null) { TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ShineTextView); if (a.hasValue(R.styleable.ShineTextView_bgShadowColor)) { float bgRadius = a.getFloat(R.styleable.ShineTextView_bgShadowRadius, 0); float bgDx = a.getFloat(R.styleable.ShineTextView_bgShadowDx, 0); float bgDy = a.getFloat(R.styleable.ShineTextView_bgShadowDy, 0); int bgColor = a.getColor(R.styleable.ShineTextView_bgShadowColor, 0xff000000); this.addOuterShadow(bgRadius, bgDx, bgDy, bgColor); } if (a.hasValue(R.styleable.ShineTextView_outerShadowColor)) { float radius = a.getFloat(R.styleable.ShineTextView_outerShadowRadius, 0); float dx = a.getFloat(R.styleable.ShineTextView_outerShadowDx, 0); float dy = a.getFloat(R.styleable.ShineTextView_outerShadowDy, 0); int color = a.getColor(R.styleable.ShineTextView_outerShadowColor, 0xff2b88f6); this.addOuterShadow(radius, dx, dy, color); } a.recycle(); } } public void updateShadow() { } public void addOuterShadow(float r, float dx, float dy, int color) { outerShadows.add(new ShineTextView.Shadow(r, dx, dy, color)); } public void clearOuterShadows() { outerShadows.clear(); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); this.setCompoundDrawables(null, null, null, null); for (ShineTextView.Shadow shadow : outerShadows) { this.setShadowLayer(shadow.r, shadow.dx, shadow.dy, shadow.color); super.onDraw(canvas); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (widthMode == MeasureSpec.EXACTLY) { } else if (widthMode == MeasureSpec.AT_MOST) { } else if (widthMode == MeasureSpec.UNSPECIFIED) { } } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); } public static class Shadow { float r; float dx; float dy; int color; public Shadow(float r, float dx, float dy, int color) { this.r = r; this.dx = dx; this.dy = dy; this.color = color; } } }