仿360手机卫士的自定义波浪球形进度View
2016-08-03 19:22
295 查看
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
tools:context=".MainActivity">
<com.example.shuibo.SinkView
android:id="@+id/sink"
android:layout_width="400dp"
android:layout_height="400dp"
android:layout_centerInParent="true" >
</com.example.shuibo.SinkView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="horizontal" >
<Button
android:id="@+id/check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体验" />
</LinearLayout>
</RelativeLayout>
package com.example.shuibo;
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.Path;
import android.graphics.Region.Op;
import android.util.AttributeSet;
import android.widget.FrameLayout;
public class SinkView extends FrameLayout {
private Bitmap mBitmap, mScaleBitmap;
private Paint mPaint = new Paint();
private int mRepeatCount;
private int mSpeed = 15;
private float mLeft, mPercent;
private static final int mTextColor = 0xFFFFFFFF;
private static final int mTextSize = 250;
public SinkView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setPercent(float percent) {
mPercent = percent;
postInvalidate();
}
@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, Path.Direction.CCW);
canvas.clipPath(path, Op.REPLACE);
if (mScaleBitmap == null) {
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.wave2);
mScaleBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth(), getHeight(), false);
mBitmap.recycle();
mBitmap = null;
mRepeatCount = (int) Math.ceil(getWidth() / mScaleBitmap.getWidth() + 0.5) + 1;
}
for (int i = 0; i < mRepeatCount; i++) {
canvas.drawBitmap(mScaleBitmap, mLeft + (i - 1) * mScaleBitmap.getWidth(), (1 - mPercent) * getHeight(), null);
}
String text = (int) (mPercent * 100) + "%";
mPaint.setColor(mTextColor);
mPaint.setTextSize(mTextSize);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawText(text, (getWidth() - mPaint.measureText(text)) / 2, getHeight() / 2 + mTextSize / 2, mPaint);
mLeft += mSpeed;
if (mLeft >= mScaleBitmap.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();
}
}
package com.example.shuibo;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class MainActivity extends ActionBarActivity {
private SinkView mSinkView;
private float mPercent;
private Thread mThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSinkView = (SinkView) findViewById(R.id.sink);
findViewById(R.id.check).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
check();
}
});
mPercent = 0.3f;
mSinkView.setPercent(mPercent);
}
private void check() {
mThread = new Thread(new Runnable() {
@Override
public void run() {
mPercent = 0;
while (mPercent <= 1) {
mSinkView.setPercent(mPercent);
mPercent += 0.01f;
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//当进度条到100%时,重置初始百分比
mPercent = 0.3f;
mSinkView.setPercent(mPercent);
}
});
mThread.start();
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
tools:context=".MainActivity">
<com.example.shuibo.SinkView
android:id="@+id/sink"
android:layout_width="400dp"
android:layout_height="400dp"
android:layout_centerInParent="true" >
</com.example.shuibo.SinkView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="horizontal" >
<Button
android:id="@+id/check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体验" />
</LinearLayout>
</RelativeLayout>
package com.example.shuibo;
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.Path;
import android.graphics.Region.Op;
import android.util.AttributeSet;
import android.widget.FrameLayout;
public class SinkView extends FrameLayout {
private Bitmap mBitmap, mScaleBitmap;
private Paint mPaint = new Paint();
private int mRepeatCount;
private int mSpeed = 15;
private float mLeft, mPercent;
private static final int mTextColor = 0xFFFFFFFF;
private static final int mTextSize = 250;
public SinkView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setPercent(float percent) {
mPercent = percent;
postInvalidate();
}
@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, Path.Direction.CCW);
canvas.clipPath(path, Op.REPLACE);
if (mScaleBitmap == null) {
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.wave2);
mScaleBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth(), getHeight(), false);
mBitmap.recycle();
mBitmap = null;
mRepeatCount = (int) Math.ceil(getWidth() / mScaleBitmap.getWidth() + 0.5) + 1;
}
for (int i = 0; i < mRepeatCount; i++) {
canvas.drawBitmap(mScaleBitmap, mLeft + (i - 1) * mScaleBitmap.getWidth(), (1 - mPercent) * getHeight(), null);
}
String text = (int) (mPercent * 100) + "%";
mPaint.setColor(mTextColor);
mPaint.setTextSize(mTextSize);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawText(text, (getWidth() - mPaint.measureText(text)) / 2, getHeight() / 2 + mTextSize / 2, mPaint);
mLeft += mSpeed;
if (mLeft >= mScaleBitmap.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();
}
}
package com.example.shuibo;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class MainActivity extends ActionBarActivity {
private SinkView mSinkView;
private float mPercent;
private Thread mThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSinkView = (SinkView) findViewById(R.id.sink);
findViewById(R.id.check).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
check();
}
});
mPercent = 0.3f;
mSinkView.setPercent(mPercent);
}
private void check() {
mThread = new Thread(new Runnable() {
@Override
public void run() {
mPercent = 0;
while (mPercent <= 1) {
mSinkView.setPercent(mPercent);
mPercent += 0.01f;
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//当进度条到100%时,重置初始百分比
mPercent = 0.3f;
mSinkView.setPercent(mPercent);
}
});
mThread.start();
}
}
相关文章推荐
- Android 自定义View修炼-仿360手机卫士波浪球进度的实现
- Android 自定义View修炼-仿360手机卫士波浪球进度的实现
- Android使用自定义View实现360手机卫士波浪球进度的效果
- Android 自定义View修炼-仿360手机卫士波浪球进度的实现
- Android自定义View绘制圆形、方形、弧形、球形四种形态的模仿下载进度条
- 安卓自定义View在bitmap中玩转大波浪进度
- Android自定义View——从零开始实现水波浪进度框
- iOS球形波浪加载进度控件-HcdProcessView
- 自定义View-圆球进度的实现(仿360波浪进度)
- 源码推荐(6.8):带标题、可改变样式的自定义ActionSheet,TYWaterWaveView 水波浪圆形进度
- Android自定义WaveView实现波浪进度效果
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- android 圆形进度条 自定义view
- Android自定义View之实现环形进度条
- Android 自定义View学习(4)波浪效果+光圈扩散效果
- Android自定义view之图片加载进度
- Android 自定义View修炼-自定义View-带百分比进度的圆形进度条(采用自定义属性)
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)