废话不多说直接上代码,简单易懂
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();*/
}
}