像360卫士的波浪球进度的效果,一般最常用的方法就是画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域。

今天我这用图片bitmap的方式,大概的方法原理是:

(1)首先用clipPath裁剪园区域,

(2)然后用4张图来不断绘制到画布上,再用偏移量来控制移动的速度,从而形成波浪动态效果。

(3)有一点需要注意的是,裁剪圆的时候用到的clipPath这个方法,在android 4.1,和4.2等某些系统上,裁剪出来不是圆,而是矩形,针对这些系统 需要在manifest.xml文件的activity中

将硬件加速关掉,因为默认是开启的。即添加这个:android:hardwareAccelerated="false"

(源码在下面最后给出哈)

手机上的效果:

下面咱们就来看看怎么实现吧:

(1)自定义波浪View的实现:

package com.czm.mysinkingview;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.Path;

import android.graphics.Path.Direction;

import android.graphics.Region.Op;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.FrameLayout;

/**

* 水波浪球形进度View

* @author caizhiming

*

*/

public class MySinkingView extends FrameLayout {

private static final int DEFAULT_TEXTCOLOT = 0xFFFFFFFF;

private static final int DEFAULT_TEXTSIZE = 250;

private float mPercent;

private Paint mPaint = new Paint();

private Bitmap mBitmap;

private Bitmap mScaledBitmap;

private float mLeft, mTop;

private int mSpeed = 15;

private int mRepeatCount = 0;

private Status mFlag = Status.NONE;

private int mTextColor = DEFAULT_TEXTCOLOT;

private int mTextSize = DEFAULT_TEXTSIZE;

public MySinkingView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public void setTextColor(int color) {

mTextColor = color;

}

public void setTextSize(int size) {

mTextSize = size;

}

public void setPercent(float percent) {

mFlag = Status.RUNNING;

mPercent = percent;

postInvalidate();

}

public void setStatus(Status status) {

mFlag = status;

}

public void clear() {

mFlag = Status.NONE;

if (mScaledBitmap != null) {

mScaledBitmap.recycle();

mScaledBitmap = null;

}

if (mBitmap != null) {

mBitmap.recycle();

mBitmap = null;

}

}

@Override

protected void dispatchDraw(Canvas canvas) {

super.dispatchDraw(canvas);

int width = getWidth();

int height = getHeight();

//裁剪成圆区域

Path path = new Path();

canvas.save();

path.reset();

canvas.clipPath(path);

path.addCircle(width / 2, height / 2, width / 2, Direction.CCW);

canvas.clipPath(path, Op.REPLACE);

if (mFlag == Status.RUNNING) {

if (mScaledBitmap == null) {

mBitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.wave2);

mScaledBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth(), getHeight(), false);

mBitmap.recycle();

mBitmap = null;

mRepeatCount = (int) Math.ceil(getWidth() / mScaledBitmap.getWidth() + 0.5) + 1;

}

for (int idx = 0; idx < mRepeatCount; idx++) {

canvas.drawBitmap(mScaledBitmap, mLeft + (idx - 1) * mScaledBitmap.getWidth(), (1-mPercent) * getHeight(), null);

}

String str = (int) (mPercent * 100) + "%";

mPaint.setColor(mTextColor);

mPaint.setTextSize(mTextSize);

mPaint.setStyle(Style.FILL);

canvas.drawText(str, (getWidth() - mPaint.measureText(str)) / 2, getHeight() / 2 + mTextSize / 2, mPaint);

mLeft += mSpeed;

if (mLeft >= mScaledBitmap.getWidth())

mLeft = 0;

// 绘制外圆环

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeWidth(4);

mPaint.setAntiAlias(true);

mPaint.setColor(Color.rgb(33, 211, 39));

canvas.drawCircle(width / 2, height / 2, width / 2 - 2, mPaint);

postInvalidateDelayed(20);

}

canvas.restore();

}

public enum Status {

RUNNING, NONE

}

}

(2)布局文件的实现:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#000000"

tools:context=".MainActivity" >

android:id="@+id/sinking"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true" >

android:id="@+id/image"

android:layout_width="400dp"

android:layout_height="400dp"

android:src="@drawable/charming2" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:orientation="horizontal" >

android:id="@+id/btn_test"

android:layout_width="80dp"

android:layout_height="wrap_content"

android:text="体验" />

(3)如何使用自定义波浪View:

package com.czm.mysinkingview;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageView;

/**

* 使用并测试用例页

*

* @author caizhiming

*/

public class MainActivity extends Activity {

private MySinkingView mSinkingView;

private float percent = 0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mSinkingView = (MySinkingView) findViewById(R.id.sinking);

findViewById(R.id.btn_test).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

test();

}

});

percent = 0.56f;

mSinkingView.setPercent(percent);

}

private void test() {

Thread thread = new Thread(new Runnable() {

@Override

public void run() {

percent = 0;

while (percent <= 1) {

mSinkingView.setPercent(percent);

percent += 0.01f;

try {

Thread.sleep(40);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

percent = 0.56f;

mSinkingView.setPercent(percent);

// mSinkingView.clear();

}

});

thread.start();

}

}

最后,照例,给出源码地址

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

android 动态壁纸 波浪效果,Android使用自定义View实现360手机卫士波浪球进度的效果...相关推荐

  1. android canvas_Android 自定义View篇(七)实现环形进度条效果

    前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...

  2. java awt 仿360 进度_Android 控件进阶修炼-仿360手机卫士波浪球进度控件

    一.概述 像360卫士的波浪球进度的效果,一般最常用的方法就是 画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域. 今天我这用图片bitmap的方式,大概的方法原理是: ( ...

  3. Android动态壁纸画布透明,Android 动态壁纸LayoutParams问题

    最近在做一个动态壁纸项目,我在Engine的onCreate方法里,去添加两只"蝴蝶"时,我使用了addView(imageview,new LayoutParams(width, ...

  4. android水波效果,android动态壁纸中的水波纹效果

    [实例简介] android动态壁纸中的水波纹效果,采用opengl中的shader实现 [实例截图] [核心代码] @Override public String getVertexShader() ...

  5. Android动态壁纸解析

    转载自 Yalin Jin的文章:http://www.kinglloy.com/ MENU Android动态壁纸解析 24 JULY 2017 阅读之前 建议下载使用Style动态壁纸应用 文章后 ...

  6. Android 动态壁纸引擎试刀学习(初识安卓引擎)

    动态壁纸蛮好玩的,也没接触过,看官方有就拿了学习下,是小马第一次接触引擎Engine,激动兴奋...效果做出来了,就放博客里,记录笔记,吼吼,跟大家交流学习, 废话不多说了,先看效果,再看源码,之后小 ...

  7. android动态壁纸提取,[图]大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用...

    原标题:[图]大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用 在过去数周时间里,不断有一加8T的信息在网络上被曝光.在官方的预热和爆料人士分享的细节下,一加8T基本上已经浮出水面 ...

  8. android 动态壁纸开发

    转:http://www.eoeandroid.com/thread-100389-1-1.html android 动态壁纸开发 参考:http://www.ophonesdn.com/articl ...

  9. Android 动态壁纸开发(时钟)

    Android 动态壁纸开发(时钟) 这是我人生第一篇文章,希望大家不喜无喷啊!有兴趣的可以看看玩,因为语言组织能力有限,就废话不多说直接进入重点! 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看 ...

最新文章

  1. 安装Cocoapods,以及其中出现的问题
  2. 倒了血霉!先是贾跃亭后有罗永浩,被拖欠4400多万,最惨公司无疑了
  3. Android 用MediaCodec ,MediaExtractor解码播放MP4文件
  4. java如何设table只读_Table
  5. pycharm和jupyter notebook中的快捷键
  6. 百度地图离线_3大主流导航地图,你用的哪个?
  7. java vector 实现二维数组
  8. 立即从iOS 10和macOS Sierra下载壁纸
  9. 影视后期制作(Ae)
  10. 第七章:项目成本管理 - (7.3 制定预算)
  11. htmlcss系列学习——(五)css选择器
  12. 解密顺丰:内部360度监控,创始人王卫穿破牛仔裤见PE
  13. 浅谈5G通信中的两个微波技术
  14. 新一代的数据库备份解决方案--Oracle数据库
  15. 计算机组成原理课程设计(很全面有保障)
  16. H5 左右滑屏切页原理
  17. sql server 2008 R2 与 sql server 2012 下载地址(包括x86、x64)
  18. 用VBA合并计算Excel多个工作簿及工作表
  19. 微信公众号网页H5跳转微信小程序
  20. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

热门文章

  1. Synopsys SV Lab Guide—lab2
  2. Windows下SlikSVN的使用
  3. 文件系统,你有想过怎么访问磁盘上存储的数据吗
  4. 辰工科技_辰工石油勘探绘图平台软件V2.0
  5. 爵士鼓视频软件测试,【图片】电鼓和真鼓实际使用中的区别,买鼓的朋友可以参考【架子鼓吧】_百度贴吧...
  6. 计算机管理服务中找不到mysql的服务
  7. java无极树形结构_Java爬虫框架:SeimiCrawler——结构化解析与数据存储
  8. Raid下安装操作系统
  9. Lazarus网络编程
  10. 操作系统 银行家算法及相关例题