使用自定义+属性动画实现小圆球抛物线的效果

废话不多说直接上代码,简单易懂

xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="zhangkun.com.customcircle.MainActivity">
   <zhangkun.baway.com.customcircle.Circle
       android:id="@+id/cr"
       android:layout_width="90dp"
       android:layout_height="90dp"/>
</LinearLayout>
自定义的类
public class Circle extends ImageView {
    private Paint mPaint;
    private Context mContext;
    private int screenWidth;
    private int screenHeight;
    private int radial = 50;
    public Circle(Context context) {
        super(context);
    }
    public Circle(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public Circle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint=new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.BLUE);
        paint.setAntiAlias(false);
        int width = getWidth()/2;
        int height = getHeight()/2;
        canvas.drawCircle(width,height,50,paint);


    }
最后是activity
public class MainActivity extends AppCompatActivity {
  private Circle circle;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        circle= (Circle) findViewById(cr);
        ObjectAnimator objectAnimator=new ObjectAnimator();
        //获取屏幕的宽高
        WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        int width = display.getWidth();
        int height = display.getHeight();
        //这是利用真正的抛物线实现抛物线效果,如果不喜欢,在代码下方有用属性动画实现的抛物线效果
        circle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ValueAnimator valueAnimator = new ValueAnimator();
                valueAnimator.setDuration(3000);
                //设置中心点
                valueAnimator.setObjectValues(new PointF(0, 0));
                valueAnimator.setInterpolator(new LinearInterpolator());
                //估值器:用来计算我们的view在屏幕中显示的位置(运动的轨迹:平移、缩放、抛物线等等)。
                valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
                    @Override
                    public PointF evaluate(float fraction, PointF startValue,
                                           PointF endValue1) {
                        //4.1)计算x
                        //1>创建一个点,抛物线是由无数个点组成的,需要计算每个点的坐标
                        PointF pf=new PointF();
                        //2>fraction表示百分比,代表当前执行到了什么程度。
                        //百分比是怎么计算的呢?fraction=t/duration
                        //3>t表示当前时间,当前时间是什么呢?比如我运行到一秒,运行到两秒
                        //时间:t=fraction*duration
                        //4>pointF.x表示距离
                        //x=t*s()
                        //5>速度我们自己定义,自己定义为s=100px/s;
                        float t=fraction*3;//计算当前时间,不能写成fraction*duration,因为duration在这里表示为3000秒
                        pf.x= 200*t ; //计算当前执行的距离
                        //4.2)计算Y
                        //1>  y=0.5*g*t^2(g为重力加速度)
                        //重力加速度不够,增加十倍
                        pf.y=0.5f*98f*t*t;//0.5f不能写成1/2,因为1/2的结果为0
                        return pf;
                    }

                });
                valueAnimator.start();
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        PointF pff= (PointF) valueAnimator.getAnimatedValue();
                        circle.setX(pff.x);
                        circle.setY(pff.y);
                    }
                });
              }
        });
  //利用属性动画实现抛物线效果      /*objectAnimator.ofFloat(circle,"translationX",width).setDuration(3000).start();
        objectAnimator.ofFloat(circle,"translationY",height).setDuration(3000).start();*/
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值