Android开发:写一个自定义的RelativeLayout要求这个自定义view有个public的接口调用时该view像一幅画从右往左擦除一样的效果从右往左逐渐消失掉同时view的宽度不停减少擦除过程中里边的子View大小位置不许变!你别给我省略代码!刚给的代码还是不对!重来!
好的,请见下面的代码示例:
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的位置根据擦除的偏移量进行调整,保持其位置不变
原文地址: http://www.cveoy.top/t/topic/iYOC 著作权归作者所有。请勿转载和采集!