有没有任何方法将垂直/水平衰落边缘应用于ImageView组件?
我已经尝试过android:fadingEdge了,但是不幸的是,这个属性被废弃了,并且将在14级时被忽略,有什么想法吗?
发布于 2014-02-19 20:20:54
我创建了下面的ImageView扩展以将其与水平衰落相结合,您可以轻松地更改该类并添加垂直衰落。(用最新版本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);发布于 2017-07-11 08:07:11
我已经找到了一个很好的解决办法,对我来说是非常有效的。我需要淡出顶部和底部的imageView (但是这种方法适用于任何方面,只需创建一个不同的梯度)。我将ImageView封装在FrameLayout中,并将2View放在顶部和底部,之后,我创建了带有渐变的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>现在,两个视图位于图像视图的顶部,它们的渐变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" />
您可以选择适合您的退色高度,我选择了120 my,它很好地满足了我的需要。下面是来自我的ImageView模拟器的屏幕截图:

发布于 2019-09-03 07:06:00
Vucko's 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);https://stackoverflow.com/questions/21888674
复制相似问题