Đây là một hạn chế hiện tại của Android SDK. tôi mở rộng TextView
cho nó hoạt động, bạn có thể sử dụng nó một cách tự do:
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();
}
}
Bạn cũng cần để thêm video này attr.xml của bạn (hoặc tạo một): attr .xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Theme">
<attr format="reference" name="CustomTextView"/>
</declare-styleable>
<declare-styleable name="CustomTextView">
<attr name="shadowColors" format="color|reference"/>
<attr name="android:shadowDx"/>
<attr name="android:shadowDy"/>
<attr name="android:shadowRadius"/>
</declare-styleable>
</resources>
Vì vậy, cuối cùng bạn sẽ có thể sử dụng nó trong XMLs của bạn, như thế này:
<com.client.ui.textviews.CustomTextView
xmlns:client="http://schemas.android.com/apk/res/com.client"
android:id="@+id/join_text"
android:shadowDx="1"
android:shadowDy="1"
android:shadowRadius="1"
client:shadowColors="@color/btn_green_shadow_color"/>
đâu @color/btn_green_shadow_color
điểm đến một selector như một này:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@android:color/white"/>
<item android:state_pressed="true" android:color="@color/BzDarkGray"/>
<item android:color="@android:color/black"/>
</selector>
Nếu bạn không quen thuộc với cách sử dụng thuộc tính tùy chỉnh (với không gian tên tùy chỉnh xml tôi đã sử dụng), vui lòng tham khảo this good StackOverFlow question.
tôi biết về Màu Danh sách Nhà nước và Danh sách nhà nước drawable, nhưng bóng tối dường như là một tài sản cụ thể của TextView. Có lẽ thuộc tính bóng chỉ bị bỏ qua. Tôi đã có thể sử dụng một số phương pháp onStateChange cho các khung nhìn, thiết lập bóng tối, nhưng tôi đã chỉ tìm nó và đáng ngạc nhiên nó chỉ tồn tại cho các drawables! Sau đó tôi sẽ hỏi: liệu có thể thay đổi trạng thái xem không? – bigstones