圆点控件
package com.example.loadingviewdemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
/** 圆 */
public class CradleBall extends View {
private int width;
private int height;
private Paint paint;
public CradleBall(Context context) {
super(context);
initView();
}
public CradleBall(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public CradleBall(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.WHITE);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width = w;
height = h;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(width / 2, height / 2, width / 2, paint);
}
}
圆点动画控件
package com.example.loadingviewdemo;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.CycleInterpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.LinearLayout;
public class NewtonCradleLoading extends LinearLayout {
private CradleBall cradleBallOne;
private CradleBall cradleBallTwo;
private CradleBall cradleBallThree;
private CradleBall cradleBallFour;
private CradleBall cradleBallFive;
private static final int DURATION = 400;
private static final int SHAKE_DISTANCE = 2;
private static final float PIVOT_X = 0.5f;
private static final float PIVOT_Y = -3f;
private static final int DEGREE = 30;
private boolean isStart = false;
public NewtonCradleLoading(Context context) {
super(context);
initView(context);
}
public NewtonCradleLoading(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
@SuppressLint("NewApi")
public NewtonCradleLoading(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
/** 填充布局 */
private void initView(Context context) {
LayoutInflater.from(context).inflate(R.layout.newton_cradle_loading,
this, true);
}
/** 结束填充控件之后 */
@Override
protected void onFinishInflate() {
super.onFinishInflate();
cradleBallOne = (CradleBall) findViewById(R.id.ball_one);
cradleBallTwo = (CradleBall) findViewById(R.id.ball_two);
cradleBallThree = (CradleBall) findViewById(R.id.ball_three);
cradleBallFour = (CradleBall) findViewById(R.id.ball_four);
cradleBallFive = (CradleBall) findViewById(R.id.ball_five);
initAnim();
}
RotateAnimation rotateLeftAnimation;// cradleBallOne left to right
RotateAnimation rotateRightAnimation;// cradleBallFive right to left
TranslateAnimation shakeLeftAnimation;// 颤抖动画
TranslateAnimation shakeRightAnimation;
/** 初始化动画 */
private void initAnim() {
rotateRightAnimation = new RotateAnimation(0, -DEGREE,
RotateAnimation.RELATIVE_TO_SELF, PIVOT_X,
RotateAnimation.RELATIVE_TO_SELF, PIVOT_Y);
rotateRightAnimation.setRepeatCount(1);// 重复次数
rotateRightAnimation.setRepeatMode(Animation.REVERSE);// 重复模式
rotateRightAnimation.setDuration(DURATION);// 时间
rotateRightAnimation.setInterpolator(new LinearInterpolator());
rotateRightAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation arg0) {
// TODO Auto-generated method stub
if (isStart) {
startRightAnim();
}
}
});
shakeLeftAnimation = new TranslateAnimation(0, SHAKE_DISTANCE, 0, 0);
shakeLeftAnimation.setDuration(DURATION);
shakeLeftAnimation.setInterpolator(new CycleInterpolator(2));
rotateLeftAnimation = new RotateAnimation(0, DEGREE,
RotateAnimation.RELATIVE_TO_SELF, PIVOT_X,
RotateAnimation.RELATIVE_TO_SELF, PIVOT_Y);
rotateLeftAnimation.setRepeatCount(1);
rotateLeftAnimation.setRepeatMode(Animation.REVERSE);
rotateLeftAnimation.setDuration(DURATION);
rotateLeftAnimation.setInterpolator(new LinearInterpolator());
rotateLeftAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation arg0) {
// TODO Auto-generated method stub
if (isStart) {
cradleBallTwo.startAnimation(shakeLeftAnimation);
cradleBallThree.startAnimation(shakeLeftAnimation);
cradleBallFour.startAnimation(shakeLeftAnimation);
cradleBallFive.startAnimation(rotateRightAnimation);
}
}
});
shakeRightAnimation = new TranslateAnimation(0, -SHAKE_DISTANCE, 0, 0);
shakeRightAnimation.setDuration(DURATION);
shakeRightAnimation.setInterpolator(new CycleInterpolator(2));
shakeRightAnimation
.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
if (isStart)
startLeftAnim();
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
private void startRightAnim() {
cradleBallTwo.startAnimation(shakeRightAnimation);
cradleBallThree.startAnimation(shakeRightAnimation);
cradleBallFour.startAnimation(shakeRightAnimation);
}
private void startLeftAnim() {
cradleBallOne.startAnimation(rotateLeftAnimation);
}
public void start() {
if (!isStart) {
isStart = true;
startLeftAnim();
}
}
public void stop() {
isStart = false;
cradleBallOne.clearAnimation();
cradleBallTwo.clearAnimation();
cradleBallThree.clearAnimation();
cradleBallFour.clearAnimation();
cradleBallFive.clearAnimation();
}
public boolean isStart() {
return isStart;
}
}
使用:
package com.example.loadingviewdemo;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
private NewtonCradleLoading newtonCradleLoading;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
newtonCradleLoading = (NewtonCradleLoading) findViewById(R.id.newton_cradle_loading);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (newtonCradleLoading.isStart()) {
button.setText("开始");
newtonCradleLoading.stop();
} else {
button.setText("结束");
newtonCradleLoading.start();
}
}
});
}
}
效果:
demo 地址:
http://download.csdn.net/download/yymonkeydo/9293299