高级UI晋升之自定义View实战(六)

final ShapeHolder ball5 = balls.get(4);
ValueAnimator valueAnimator5 = ValueAnimator.ofFloat(0f,
getHeight() - ball5.getHeight());
valueAnimator5.setDuration(500);
valueAnimator5.addUpdateListener(new AnimatorUpdateListener() {                    
// ValueAnimator需要自己在监听处理中设置对象参数                    
@Override                    
public void onAnimationUpdate(ValueAnimator animation) {                        
// 用animation.getAnimatedValue()得到当前的属性值,设置进动画对象中                        
ball5.setY((Float) animation.getAnimatedValue());                        
// 记得要刷新View否则不会调用重新绘制                        
invalidate();
}
});

####3.3使用TypeEvaluator自定义动画

public class Point {

private float x;

private float y;

public Point(float x, float y) {
this.x = x;
this.y = y;
}

public void setX(float x){
this.x = x
}
public void setY(float y){
this.y = y;
}

public float getX() {
return x;
}

public float getY() {
return y;
}

}

public class PointEvaluator implements TypeEvaluator{

@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoint = (Point) startValue;
Point endPoint = (Point) endValue;
float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
Point point = new Point(x, y);
return point;
}

}

public class MyTaget{
private Point point = new Point(0f,0f);
public void setPoint(Point p){
this.point = point;
}
public Point getPoint(){
return this.point;
}
}

Point point1 = new Point(0, 0);
Point point2 = new Point(300, 300);
ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2);
anim.setTarget(new MyTarget());
anim.setDuration(5000);
anim.start();

或如下使用

ObjectAnimator.ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object… values)

#4.通关过扩展原有属性方式自定义动画

(由于属性动画的属性必须具有setter与getter,对于一些特别的属性,需要使用代理)

public class WrapperView{
private View targetView;
public WrapperView(View targetView){
this.targetView = targetView;
}
public void setWidth(int width){
targetView.getLayoutParams().width = width;
targetView.requestLayout();
}
public int getWidth(){
return targetView.getLayoutParams().width;
}
}

使用方法

WrapperView wrapper = new WrapperView(mLinearLayout);
ObjectAnimator.ofInt(wrapper,“width”,300).setDuration(3000).start();

Android 自定义动画Animation 使用Camera实现3D动画效果,这里的Camera不是相机,而是场景动画,意味着有导演

public class MyAnimation extends Animation {
int mCenterX,mCenterY;

Camera camera = new Camera();

public MyAnimation() {
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Matrix matrix = t.getMatrix();  
camera.save();
camera.translate(0f, 0f, (1300 - 1300*interpolatedTime));

文末

那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。
Android希望=技能+面试

  • 技能
  • 面试技巧+面试题

于只有自己。
Android希望=技能+面试

  • 技能
    [外链图片转存中…(img-Bcc37Dse-1726086273454)]
  • 面试技巧+面试题
    [外链图片转存中…(img-aFFcVIwo-1726086273455)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值