android自定义loding view(上)

来源:互联网 发布:linux 黑客工具 编辑:程序博客网 时间:2024/05/22 13:04

此文的github地址:https://github.com/1181631922/OrliteDemo

也算是需求需要把,需要自定义loading,相信如果是一般情况下都会是想到用帧动画吧,下面是实现此loading的第一步,先让他实现静态的画面,ok,下面上代码:

CircleLoadingView
package com.fanyafeng.orlitedemo.myview;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.view.View;/** * Created by 365rili on 16/4/20. */public class CircleLoadingView extends View {    private Paint circleContour;    public CircleLoadingView(Context context) {        super(context);    }    public CircleLoadingView(Context context, AttributeSet attrs) {        super(context, attrs);        circleContour = new Paint(Paint.ANTI_ALIAS_FLAG);    }    public CircleLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        float circleContourStrokeWidth = 5;        circleContour.setAntiAlias(true);        circleContour.setColor(Color.parseColor("#3498DB"));//        circleContour.setStyle(Paint.Style.STROKE);        circleContour.setStrokeWidth(circleContourStrokeWidth);        float startX = getLeft();        float endX = getRight();        float startY = getTop();        float endY = getBottom();        float height = getHeight();        float width = getWidth();//        轮廓的半径        float circleContourRadius = (endY > endX ? (endX - startX) / 2 - circleContourStrokeWidth / 2 : (endY - startY) / 2 - circleContourStrokeWidth / 2);        float circleCountourX = width / 2;        float circleCountourY = height / 2;//        canvas.drawCircle(circleCountourX, circleCountourY, circleContourRadius, circleContour);//        画一条垂直的线//        canvas.drawLine(circleCountourX, circleCountourY, circleCountourX, circleCountourY - circleContourRadius, circleContour);//        根据公式推导,每个间隔所占的角度为:11.25度,最小的圆的度数为7.5度,每个圆以7.5度等差增长,一共需要画8个圆//        第一个:sin3.75*第一个大圆的半径   sin7.5  sin11.25 sin15 sin18.75 sin22.5 sin26.25 sin30//        内接大圆的直径为外接大圆半径的三分之二        float radius = circleContourRadius / 3;//        loading圆们距离圆心的距离        float circleLength = 2 * radius;//        每一度所对应的数值        double everyRadiusLength = 2 * Math.PI / 360;        Log.d("TAG", "圆心距离:" + circleLength + "每一度的距离:" + everyRadiusLength);//      每个间隔的角度        double spaceAngle = 11.25;        //      画最后一个要旋转的圆(大圆)//      canvas.drawCircle(circleCountourX, circleCountourY - radius * 2, (float) eighthRadius, circleContour);        double eighthAngle = 30;        double eighthX = circleCountourX - circleLength * Math.sin(eighthAngle * everyRadiusLength);        double eighthY = circleCountourY - circleLength * Math.cos(eighthAngle * everyRadiusLength);        double eighthRadius = circleLength * Math.sin(eighthAngle * everyRadiusLength);        canvas.drawCircle((float) eighthX, (float) eighthY, (float) eighthRadius, circleContour);        double seventhAngle = 30 * 2 + spaceAngle + 26.25;        double seventhX = circleCountourX - circleLength * Math.sin(seventhAngle * everyRadiusLength);        double seventhY = circleCountourY - circleLength * Math.cos(seventhAngle * everyRadiusLength);        double seventhRadius = circleLength * Math.sin(26.25 * everyRadiusLength);        canvas.drawCircle((float) seventhX, (float) seventhY, (float) seventhRadius, circleContour);        double sixthAngle = 30 * 2 + spaceAngle + 26.25 * 2 + spaceAngle + 22.5;        double sixthX = circleCountourX - circleLength * Math.sin(sixthAngle * everyRadiusLength);        double sixthY = circleCountourY - circleLength * Math.cos(sixthAngle * everyRadiusLength);        double sixthRadius = circleLength * Math.sin(22.5 * everyRadiusLength);        canvas.drawCircle((float) sixthX, (float) sixthY, (float) sixthRadius, circleContour);        double fifthAngle = 30 * 2 + spaceAngle + 26.25 * 2 + spaceAngle + 22.5 * 2 + spaceAngle + 18.75;        double fifthX = circleCountourX - circleLength * Math.sin(fifthAngle * everyRadiusLength);        double fifthY = circleCountourY - circleLength * Math.cos(fifthAngle * everyRadiusLength);        double fifthRadius = circleLength * Math.sin(18.75 * everyRadiusLength);        canvas.drawCircle((float) fifthX, (float) fifthY, (float) fifthRadius, circleContour);        double forthAngle = 30 * 2 + spaceAngle + 26.25 * 2 + spaceAngle + 22.5 * 2 + spaceAngle + 18.75 * 2 + spaceAngle + 15;        double forthX = circleCountourX - circleLength * Math.sin(forthAngle * everyRadiusLength);        double forthY = circleCountourY - circleLength * Math.cos(forthAngle * everyRadiusLength);        double forthRadius = circleLength * Math.sin(15 * everyRadiusLength);        canvas.drawCircle((float) forthX, (float) forthY, (float) forthRadius, circleContour);        double thirdAngle = 30 * 2 + spaceAngle + 26.25 * 2 + spaceAngle + 22.5 * 2 + spaceAngle + 18.75 * 2 + spaceAngle + 15 * 2 + spaceAngle + 11.25;        double thirdX = circleCountourX - circleLength * Math.sin(thirdAngle * everyRadiusLength);        double thirdY = circleCountourY - circleLength * Math.cos(thirdAngle * everyRadiusLength);        double thirdRadius = circleLength * Math.sin(11.25 * everyRadiusLength);        canvas.drawCircle((float) thirdX, (float) thirdY, (float) thirdRadius, circleContour);        double secondAngle = 30 * 2 + spaceAngle + 26.25 * 2 + spaceAngle + 22.5 * 2 + spaceAngle + 18.75 * 2 + spaceAngle + 15 * 2 + spaceAngle + 11.25 * 2 + spaceAngle + 7.5;        double secondX = circleCountourX - circleLength * Math.sin(secondAngle * everyRadiusLength);        double secondY = circleCountourY - circleLength * Math.cos(secondAngle * everyRadiusLength);        double secondRadius = circleLength * Math.sin(7.5 * everyRadiusLength);        canvas.drawCircle((float) secondX, (float) secondY, (float) secondRadius, circleContour);//      求出第一个圆的x和y的位置        double firstAngle = 30 * 2 + spaceAngle + 26.25 * 2 + spaceAngle + 22.5 * 2 + spaceAngle + 18.75 * 2 + spaceAngle + 15 * 2 + spaceAngle + 11.25 * 2 + spaceAngle + 7.5 * 2 + spaceAngle + 3.75;        double firstX = circleCountourX - circleLength * Math.sin(firstAngle * everyRadiusLength);        double firstY = circleCountourY - circleLength * Math.cos(firstAngle * everyRadiusLength);        double firstRadius = circleLength * Math.sin(3.75 * everyRadiusLength);        canvas.drawCircle((float) firstX, (float) firstY, (float) firstRadius, circleContour);        Log.d("TAG", "第一个圆半径:" + firstRadius + "第二个圆半径:" + secondRadius + "第三个圆半径:" + thirdRadius + "第四个圆半径:" + forthRadius);        Log.d("TAG", "第五个圆半径:" + fifthRadius + "第六个圆半径:" + sixthRadius + "第七个圆半径:" + seventhRadius + "第八个圆半径:" + eighthRadius);//        同心圆//        canvas.drawCircle(circleCountourX, circleCountourY, circleLength, circleContour);    }}
看一下xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:orientation="vertical"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:context="com.fanyafeng.orlitedemo.activity.CircleLoadingActivity"    tools:showIn="@layout/activity_circle_loading">    <com.fanyafeng.orlitedemo.myview.CircleLoadingView        android:layout_width="300dp"        android:layout_height="300dp"        android:layout_centerVertical="true"        android:layout_centerHorizontal="true" /></RelativeLayout>

ok,到现在为止静态的loading实现完成,还需要完成两个步骤,一是动态必不可少,第二是加上loading text,这我打算加上visable或者gone

写给自己:不知应无畏,可潜意识却胆怯


0 0
原创粉丝点击