How to add shadow to TextView on selection/focus

后端 未结 3 1137
情书的邮戳
情书的邮戳 2020-12-23 22:54

My question is how to add a shadow to text when TextView is selected or View that TextView is in gets selected. For example I have a CheckedTextView which changes background

3条回答
  •  温柔的废话
    2020-12-23 23:15

    This is a current limitation of the Android SDK. I extended TextView for it to work, you can use it freely:

    CustomTextView.java:

    import android.widget.TextView;
    import android.util.AttributeSet;
    import android.content.res.TypedArray;
    import android.content.Context;
    
    import com.client.R;
    
    
    public class CustomTextView extends TextView
    {
    
        private static String TAG = "CustomTextView";
    
        private ColorStateList mShadowColors;
        private float mShadowDx;
        private float mShadowDy;
        private float mShadowRadius;
    
    
        public CustomTextView(Context context)
        {
            super(context);
        }
    
    
        public CustomTextView(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            init(context, attrs);
        }
    
    
        public CustomTextView(Context context, AttributeSet attrs, int defStyle)
        {
            super(context, attrs, defStyle);
            init(context, attrs);
        }
    
    
        /**
         * Initialization process
         * 
         * @param context
         * @param attrs
         * @param defStyle
         */
        private void init(Context context, AttributeSet attrs, int defStyle)
        {
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView, defStyle, 0);
    
            final int attributeCount = a.getIndexCount();
            for (int i = 0; i < attributeCount; i++) {
                int curAttr = a.getIndex(i);
    
                switch (curAttr) {                  
                    case R.styleable.CustomTextView_shadowColors:
                        mShadowColors = a.getColorStateList(curAttr);
                        break;
    
                    case R.styleable.CustomTextView_android_shadowDx:
                        mShadowDx = a.getFloat(curAttr, 0);
                        break;
    
                    case R.styleable.CustomTextView_android_shadowDy:
                        mShadowDy = a.getFloat(curAttr, 0);
                        break;
    
                    case R.styleable.CustomTextView_android_shadowRadius:
                        mShadowRadius = a.getFloat(curAttr, 0);
                        break;  
    
                    default:
                    break;
            }
        }
    
            a.recycle();
    
            updateShadowColor();
        }
    
        private void updateShadowColor()
        {
            if (mShadowColors != null) {
                setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColors.getColorForState(getDrawableState(), 0));
                invalidate();
            }
        }
    
        @Override
        protected void drawableStateChanged()
        {
            super.drawableStateChanged();
            updateShadowColor();
        }
    }
    

    You also need to add this to your attr.xml (or create one): attr.xml:

    
    
        
            
        
    
        
            
            
            
            
    
        
    
    

    So finally you'll be able to use it in your xmls, like this:

    
    

    Where @color/btn_green_shadow_color points to a selector such a this:

    
    
    
        
        
        
    
    
    

    If you are not familiar with how to use custom attributes (with the custom xml namespace I used), please refer to this good StackOverFlow question.

提交回复
热议问题