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
- android自定义loding view(上)
- android自定义loding view(中)
- android自定义loding view(下)
- DIV上显示loding
- android自定义View&自定义ViewGroup(上)
- android自定义View&自定义ViewGroup(上)
- Android 自定义view之扇形菜单(上)
- Loding
- Android自定义view-弹性ScrollView(上)
- Android自定义view之 Graphics2D Api(上)
- Android Custom View (自定义 View)
- Android自定义View(三)继承View
- Android View体系(九)自定义View
- Android View体系(九)自定义View
- Android view 详解(四) 自定义view
- Android 自定义属性 view (继承View)
- android 自定义view(二),继承view
- Android自定义view之(刻度尺view)
- OpenCV中CV_IS_MAT_CONT(src->type & dst->type) 的含义!
- 【leetcode】209. Minimum Size Subarray Sum
- Prime Ring Problem
- solr5.4的安装配置
- 查看文件的中间行
- android自定义loding view(上)
- JavaScript入门
- struts上传和下载
- There are inconsistent line endings in the "XXX.cs" script
- Class.isAssignableFrom()和instanceOf关键字
- [x-Code7新功能之四]Core Location和MapKit框架练习
- 刷新例子
- TransR/CTransR论文剩余部分:元组分类,文本关系抽取,结论
- hdoj 5665 Lucky 【水题】