中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android使用自定義View實現360手機衛士波浪球進度的效果

發布時間:2020-09-29 21:07:57 來源:腳本之家 閱讀:290 作者:Jamy Cai 欄目:移動開發

像360衛士的波浪球進度的效果,一般最常用的方法就是畫線的方式,先繪sin線或貝塞爾曲線,然后從左到右繪制豎線,然后再裁剪圓區域。

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

(1)首先用clipPath裁剪園區域,

(2)然后用4張圖來不斷繪制到畫布上,再用偏移量來控制移動的速度,從而形成波浪動態效果。

(3)有一點需要注意的是,裁剪圓的時候用到的clipPath這個方法,在android 4.1,和4.2等某些系統上,裁剪出來不是圓,而是矩形,針對這些系統 需要在manifest.xml文件的activity中

將硬件加速關掉,因為默認是開啟的。即添加這個:android:hardwareAccelerated="false"

(源碼在下面最后給出哈)

手機上的效果:

Android使用自定義View實現360手機衛士波浪球進度的效果

Android使用自定義View實現360手機衛士波浪球進度的效果

下面咱們就來看看怎么實現吧:

(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)布局文件的實現:

<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:background="#000000"
 tools:context=".MainActivity" >
 <com.czm.mysinkingview.MySinkingView
 android:id="@+id/sinking"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" 
 android:layout_centerInParent="true" >
 <ImageView
 android:id="@+id/image"
 android:layout_width="400dp"
 android:layout_height="400dp"
 android:src="@drawable/charming2" />
 </com.czm.mysinkingview.MySinkingView>
 <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/btn_test"
 android:layout_width="80dp"
 android:layout_height="wrap_content"
 android:text="體驗" />
 </LinearLayout>
</RelativeLayout>

(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();
 }
}

最后,照例,給出源碼地址

真題園網

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定远县| 西峡县| 卢龙县| 麻阳| 马公市| 钟祥市| 全南县| 昌吉市| 资兴市| 碌曲县| 公主岭市| 油尖旺区| 弋阳县| 双峰县| 崇信县| 五常市| 太和县| 永丰县| 南阳市| 义马市| 蕲春县| 溆浦县| 开封县| 荥阳市| 卢湾区| 和平县| 竹溪县| 天台县| 静宁县| 唐河县| 桐城市| 共和县| 沂源县| 宝鸡市| 蒲江县| 洪泽县| 措勤县| 淅川县| 弥渡县| 绥化市| 南部县|