码迷,mamicode.com
首页 > 移动开发 > 详细

android自定义View之(四)------一键清除动画

时间:2015-01-24 17:24:56      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:android   view   

1.前言:

    自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法。今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画。当年,我实现这个是用了几张图片,采用Frame anination的方式来实现,但是这个方法,不灵活,并且占资源,下面,我就采用自定义view的方法来实现这个功能。

2.效果图:

技术分享



3.具体详细代码

3.1 \res\values\attrs_on_key_clear_circle_view.xml

<resources>
    <declare-styleable name="OnKeyClearCircleView">
        <attr name="innerCircleColor" format="color" />
        <attr name="outCircleColor" format="color" />
        <attr name="innerCircleRadius" format="integer" />
        <attr name="progress" format="integer" />
        <attr name="textSize" format="dimension" />
        <attr name="outArcwidth" format="dimension" />
    </declare-styleable>
</resources>

3.2 OnKeyClearCircleView.java

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.example.administrator.customview.R;

public class OnKeyClearCircleView extends View implements Runnable{

    private static final String TAG = "OnKeyClearCircleView";
    private Paint paint;
    private Paint outCirclePaint;
    private Paint textPaint;
    private Paint outArcPaint;
    private Paint radarPain;
    private Paint pointPain;

    private int radarRotateDegree;
    private int innerCircleColor;
    private int innerCircleRadius;
    private int outCircleColor;
    private float outArcwidth;

    private SweepGradient outArcSweepGradient;
    private SweepGradient radarSweepGradient;

    private Bitmap pointDrawable;
    private Matrix pointRotate=new Matrix();

    private int progress;
    private float textSize;
    private int padding;

    private float startAngle;
    private float radarSweepAngle;
    private float pointRotateDegree;

    private boolean isSart;

    public OnKeyClearCircleView(Context context) {
        super(context);
        init(null, 0);
    }

    public OnKeyClearCircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }

    public OnKeyClearCircleView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs, defStyle);
    }

    private void init(AttributeSet attrs, int defStyle) {
        final TypedArray a = getContext().obtainStyledAttributes(
                attrs, R.styleable.OnKeyClearCircleView, defStyle, 0);
        innerCircleColor = a.getColor(R.styleable.OnKeyClearCircleView_innerCircleColor, Color.BLUE);
        outCircleColor = a.getColor(R.styleable.OnKeyClearCircleView_outCircleColor, Color.GRAY);
        innerCircleRadius = a.getInt(R.styleable.OnKeyClearCircleView_innerCircleRadius, 10);
        progress = a.getInt(R.styleable.OnKeyClearCircleView_progress,0);
        textSize = a.getDimension(R.styleable.OnKeyClearCircleView_textSize, 20);
        outArcwidth = a.getDimension(R.styleable.OnKeyClearCircleView_outArcwidth, 20);
        a.recycle();
        pointDrawable = BitmapFactory.decodeResource(getResources(),R.drawable.point);
        isSart = false;
        startAngle = 0;
        radarRotateDegree = 0;
        radarSweepAngle = 0;
        pointRotateDegree = 0;
        padding = 5;
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(innerCircleColor);
        outCirclePaint = new Paint();
        outCirclePaint.setAntiAlias(true);
        outCirclePaint.setColor(outCircleColor);
        outCirclePaint.setStyle(Paint.Style.FILL);
        textPaint = new Paint();
        textPaint.setTextSize(textSize);
        textPaint.setAntiAlias(true);
        outArcPaint = new Paint();
        outArcPaint.setAntiAlias(true);
        outArcPaint.setStyle(Paint.Style.STROKE);
        outArcPaint.setStrokeWidth(outArcwidth);
        outArcPaint.setStrokeCap(Paint.Cap.ROUND);
        radarPain = new Paint();
        outArcPaint.setAntiAlias(true);
        pointPain = new Paint();
        pointPain.setAntiAlias(true);
        Thread thread=new Thread(this);
        thread.start();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        int d = (width >= height) ? height : width;
        setMeasuredDimension(d,d);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        int width = getMeasuredWidth();
        int height = getMeasuredHeight();
        int pointX =  width/2;
        int pointY = height/2;
        RectF rectf = new RectF(outArcwidth/2,outArcwidth/2,width-outArcwidth/2,height-outArcwidth/2);
        //outArcSweepGradient = new SweepGradient(0,0,getResources().getColor(R.color.start_color),getResources().getColor(R.color.end_color));
        outArcSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.WHITE);
        outArcPaint.setShader(outArcSweepGradient);
        canvas.drawArc(rectf,startAngle,180,false,outArcPaint);

        canvas.drawCircle(pointX,pointY,pointX -outArcwidth-padding,outCirclePaint);

        if(radarSweepAngle < 180){
            radarSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.RED);
        }else{
            radarSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.GREEN);
        }
        radarPain.setShader(radarSweepGradient);
        RectF rectfRadar = new RectF(outArcwidth+padding,outArcwidth+padding,width-outArcwidth-padding,height-outArcwidth-padding);
        canvas.drawArc(rectfRadar,0,radarSweepAngle,true,radarPain);

        canvas.save();
        canvas.translate(pointX,pointY);
        pointRotate.setRotate(pointRotateDegree);
        canvas.drawBitmap(pointDrawable, pointRotate, pointPain);
        canvas.restore();;

        canvas.drawCircle(pointX,pointY,innerCircleRadius,paint);

        float textWidth = textPaint.measureText(progress + "%");
        if(progress < 50){
            //textPaint.setColor(oxbf3800);
            textPaint.setColor(Color.RED);
        }else{
            //textPaint.setColor(new Color(ox6ec705));
            textPaint.setColor(Color.GREEN);
        }
        canvas.drawText(progress+"%",pointX - textWidth/2,pointY + textSize/2 ,textPaint);
    }

    @Override
    public void run() {
            while(true){
                if(isSart){
                    this.startAngle += 20;
                    if(this.startAngle > 360){
                        this.startAngle = this.startAngle-360;
                    }
                    this.radarSweepAngle += 10;
                    if(this.radarSweepAngle > 360){
                        this.radarSweepAngle = this.radarSweepAngle-360;
                    }
                    this.pointRotateDegree += 10;
                    if(this.pointRotateDegree > 360){
                        this.pointRotateDegree = this.pointRotateDegree-360;
                    }
                    progress = (int)radarSweepAngle*100/360;

                    postInvalidate();
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
    }

    public void startClear(){
        this.isSart =  true;
    }

    public void stopClear(){
        this.isSart =false;
    }

    public int getProgress() {
        return progress;
    }

    public void setProgress(int progress) {
        this.progress = progress;
    }
}

3.3 res\layout\activity_custom_view_activity4.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.administrator.customview.customview04.CustomViewActivity4">

    <com.example.administrator.customview.customview04.OnKeyClearCircleView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:id="@+id/onKeyClearCircleView"
        android:background="#fdda6f"
        app:innerCircleColor="#ffffff"
        app:innerCircleRadius="35"
        app:textSize="20sp"
        app:progress="82"
        app:outCircleColor="#dbdad7"
        app:outArcwidth="10dp"
    />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start"
        android:id="@+id/start"
        android:layout_below="@+id/onKeyClearCircleView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="end"
        android:id="@+id/end"
        android:layout_below="@+id/start"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>

3.4 CustomViewActivity4.java

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.administrator.customview.R;

public class CustomViewActivity4 extends Activity implements View.OnClickListener {

    private OnKeyClearCircleView onKeyClearCircleView;
    private Button start;
    private Button end;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view_activity4);
        init();
    }

    private void init() {
        onKeyClearCircleView = (OnKeyClearCircleView) findViewById(R.id.onKeyClearCircleView);
        start = (Button) findViewById(R.id.start);
        start.setOnClickListener(this);
        end = (Button) findViewById(R.id.end);
        end.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if(view == start){
            onKeyClearCircleView.startClear();
        }else if(view == end){
            onKeyClearCircleView.stopClear();
        }
    }
}


4.代码下载地址:



5.参考资料:

1.Android自定义View实现雷达扫描动画

http://blog.csdn.net/oxygen0106/article/details/40144781

2.利用Android自定义View实现转盘旋转的效果

http://blog.csdn.net/canchew/article/details/5633421


android自定义View之(四)------一键清除动画

标签:android   view   

原文地址:http://blog.csdn.net/hfreeman2008/article/details/43051425

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!