好的,请见下面的代码示例:

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

public class EraseRelativeLayout extends RelativeLayout {
    private float eraseOffset = 0;
    private Paint erasePaint;

    public EraseRelativeLayout(Context context) {
        super(context);
        init();
    }

    public EraseRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public EraseRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        erasePaint = new Paint();
        erasePaint.setColor(getResources().getColor(android.R.color.transparent));
        erasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        setWillNotDraw(false);
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        super.addView(child, index, params);
        child.setTranslationX(-eraseOffset);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (eraseOffset > 0) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                canvas.drawRect(getWidth() - eraseOffset, 0, getWidth(), getHeight(), erasePaint);
            } else {
                canvas.drawRect(getScrollX() + getWidth() - eraseOffset, 0, getScrollX() + getWidth(), getHeight(), erasePaint);
            }
        }
    }

    public void startErasing() {
        ValueAnimator animator = ValueAnimator.ofFloat(0, getWidth());
        animator.setDuration(2000);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                eraseOffset = (float) animation.getAnimatedValue();
                invalidate();
            }
        });
        animator.start();
    }
}

使用方法:

EraseRelativeLayout eraseRelativeLayout = new EraseRelativeLayout(context);
eraseRelativeLayout.addView(childView, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
eraseRelativeLayout.startErasing();

以上代码中,自定义的EraseRelativeLayout继承自RelativeLayout,在onDraw方法中绘制一个逐渐消失的矩形,并通过ValueAnimator实现从右往左擦除的效果。startErasing方法用于开始擦除动画。在addView方法中,将子View的位置根据擦除的偏移量进行调整,保持其位置不变

Android开发:写一个自定义的RelativeLayout要求这个自定义view有个public的接口调用时该view像一幅画从右往左擦除一样的效果从右往左逐渐消失掉同时view的宽度不停减少擦除过程中里边的子View大小位置不许变!你别给我省略代码!刚给的代码还是不对!重来!

原文地址: http://www.cveoy.top/t/topic/iYOC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录