有没有办法将垂直/水平渐变边应用于ImageView
组件?
我已经尝试了android:fadingEdge
但遗憾的是这个属性已弃用,从API级别14开始会被忽略,有什么想法吗?
答案 0 :(得分:7)
我找到了一个完美的解决方案,对我来说非常合适。我需要淡出imageView 的顶部和底部(这种方法适用于任何一方,只需创建一个不同的渐变)。我将ImageView
包裹在FrameLayout
内并将2 View
放到顶部和底部,之后,我创建了带有渐变的xml,用于这些和简单地把它们作为背景。这是它的外观:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:adjustViewBounds="true" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/fade_effect_heigth"
android:layout_gravity="bottom"
android:background="@drawable/custom_gradient_bottom"/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/fade_effect_heigth"
android:layout_gravity="top"
android:background="@drawable/custom_gradient_top"/>
</FrameLayout>
现在2个视图位于图像视图的顶部,它们的渐变xml背景文件看起来像这样(这是顶部渐变,底部只是翻转开始/结束颜色):
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<gradient
android:angle="90"
android:startColor="#00000000" <- black with 0 alpha, so transparent
android:endColor="#000000" <- black color
android:type="linear" />
你可以选择适合你的淡入淡出的高度,我选择了120dp,它很好地满足了我的需求。这是我ImageView
的模拟器屏幕截图:
答案 1 :(得分:4)
我创建了ImageView
的以下扩展以将其与水平渐变相结合,您可以轻松更改此类并添加垂直渐变。 ( 使用最新的Android版本4.4.2进行测试 )
基类:
public class FadingImageView extends ImageView {
private FadeSide mFadeSide;
private Context c;
public enum FadeSide {
RIGHT_SIDE, LEFT_SIDE
}
public FadingImageView(Context c, AttributeSet attrs, int defStyle) {
super(c, attrs, defStyle);
this.c = c;
init();
}
public FadingImageView(Context c, AttributeSet attrs) {
super(c, attrs);
this.c = c;
init();
}
public FadingImageView(Context c) {
super(c);
this.c = c;
init();
}
private void init() {
// Enable horizontal fading
this.setHorizontalFadingEdgeEnabled(true);
// Apply default fading length
this.setEdgeLength(14);
// Apply default side
this.setFadeDirection(FadeSide.RIGHT_SIDE);
}
public void setFadeDirection(FadeSide side) {
this.mFadeSide = side;
}
public void setEdgeLength(int length) {
this.setFadingEdgeLength(getPixels(length));
}
@Override
protected float getLeftFadingEdgeStrength() {
return mFadeSide.equals(FadeSide.LEFT_SIDE) ? 1.0f : 0.0f;
}
@Override
protected float getRightFadingEdgeStrength() {
return mFadeSide.equals(FadeSide.RIGHT_SIDE) ? 1.0f : 0.0f;
}
@Override
public boolean hasOverlappingRendering() {
return true;
}
@Override
public boolean onSetAlpha(int alpha) {
return false;
}
private int getPixels(int dipValue) {
Resources r = c.getResources();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
dipValue, r.getDisplayMetrics());
}
}
<强>用法:强>
- 在XML中创建以下对象:
<com.your.package.FadingImageView
android:id="@+id/fade_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/some_drawable" />
- 然后应用您想要的淡入淡出方:
FadingImageView mFadingImageView = (FadingImageView) findViewById(R.id.fade_image_view);
mFadingImageView.setEdgeLength(28);
mFadingImageView.setFadeDirection(FadeSide.RIGHT_SIDE);
答案 2 :(得分:0)
尝试以下方法:不需要扩展ImageView
imageView.scrollTo();
imageView.setHorizontalFadingEdgeEnabled(true);
imageView.setFadingEdgeLength(40);
答案 3 :(得分:0)
只需将您的drawable与您的自定义drawable中的边缘颜色合并,就像这样...... 的 fade_image_background.xml 强>
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/abc" />
<item>
<shape android:shape="rectangle">
<gradient
android:angle="270"
android:endColor="#000000"
android:startColor="#00000000"
android:type="linear" />
</shape>
</item>
并像这样使用这个自定义绘图..
android:background="@drawable/fade_image_background"
答案 4 :(得分:0)
Vucko的answer的一小部分。
此类可以一次为多个边缘添加渐变。
public class FadingImageView extends AppCompatImageView {
private boolean mFadeRight;
private boolean mFadeLeft;
private boolean mFadeTop;
private boolean mFadeBottom;
private Context c;
public FadingImageView(Context c, AttributeSet attrs, int defStyle) {
super(c, attrs, defStyle);
this.c = c;
init();
}
public FadingImageView(Context c, AttributeSet attrs) {
super(c, attrs);
this.c = c;
init();
}
public FadingImageView(Context c) {
super(c);
this.c = c;
init();
}
private void init() {
// Enable horizontal fading
this.setHorizontalFadingEdgeEnabled(true);
this.setVerticalFadingEdgeEnabled(true);
// Apply default fading length
this.setEdgeLength(14);
// Apply default side
this.setFadeRight(true);
}
public void setFadeRight(boolean fadeRight) {
mFadeRight = fadeRight;
}
public void setFadeLeft(boolean fadeLeft) {
mFadeLeft = fadeLeft;
}
public void setFadeTop(boolean fadeTop) {
mFadeTop = fadeTop;
}
public void setFadeBottom(boolean fadeBottom) {
mFadeBottom = fadeBottom;
}
public void setEdgeLength(int length) {
this.setFadingEdgeLength(getPixels(length));
}
@Override
protected float getTopFadingEdgeStrength() {
return mFadeTop ? 1.0f : 0.0f;
}
@Override
protected float getBottomFadingEdgeStrength() {
return mFadeBottom ? 1.0f : 0.0f;
}
@Override
protected float getLeftFadingEdgeStrength() {
return mFadeLeft ? 1.0f : 0.0f;
}
@Override
protected float getRightFadingEdgeStrength() {
return mFadeRight ? 1.0f : 0.0f;
}
@Override
public boolean hasOverlappingRendering() {
return true;
}
@Override
public boolean onSetAlpha(int alpha) {
return false;
}
private int getPixels(int dipValue) {
Resources r = c.getResources();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
dipValue, r.getDisplayMetrics());
}
}
并在所有边缘添加淡入淡出
mFadingImageView.setFadeTop(true);
mFadingImageView.setFadeBottom(true);
mFadingImageView.setFadeLeft(true);
mFadingImageView.setFadeRight(true);