最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android使用自定義View實現(xiàn)360手機衛(wèi)士波浪球進度的效果

 更新時間:2018年05月16日 09:12:04   作者:Jamy Cai  
360衛(wèi)士的波浪球進度的效果,一般最常用的方法就是畫線的方式,先繪sin線或貝塞爾曲線,然后從左到右繪制豎線,然后再裁剪圓區(qū)域

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

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

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

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

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

將硬件加速關(guān)掉,因為默認(rèn)是開啟的。即添加這個:android:hardwareAccelerated="false"

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

手機上的效果:


下面咱們就來看看怎么實現(xiàn)吧:

(1)自定義波浪View的實現(xiàn):

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();
 //裁剪成圓區(qū)域
 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;
 // 繪制外圓環(huán)
 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)布局文件的實現(xiàn):

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

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

真題園網(wǎng)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

东宁县| 扶沟县| 汤原县| 行唐县| 平利县| 沅陵县| 航空| 福清市| 黔西县| 石阡县| 历史| 阿尔山市| 临夏县| 丽水市| 鄱阳县| 韶关市| 那坡县| 太白县| 佛山市| 西峡县| 四会市| 乐昌市| 彭阳县| 垫江县| 沙洋县| 南丹县| 石台县| 安新县| 聂拉木县| 翼城县| 阿勒泰市| 江油市| 南京市| 永济市| 广灵县| 科尔| 大关县| 陆丰市| 峡江县| 舒兰市| 南通市|