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

Android自定義View旋轉(zhuǎn)圓形圖片

 更新時(shí)間:2018年01月24日 08:44:43   作者:WhatYouSeeMe  
這篇文章主要為大家詳細(xì)介紹了Android自定義View旋轉(zhuǎn)圓形圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一個(gè)自定義View,記錄一下思路和代碼以備以后使用。

思路:

1.首先要畫一個(gè)圓形圖片和一個(gè)圓形背景圖(通過自定義View);
2.自定義View基本步驟初始化屬性,測量寬高和中心點(diǎn),然后繪制圖片;
3.通過handler實(shí)現(xiàn)圖片的角度旋轉(zhuǎn).然后然后就慢慢擼.

效果圖:

 

1、廢話不多直接上代碼

public class MusicPlayerView extends View {
 private static final long ROTATE_DELAY = 5;//旋轉(zhuǎn)動(dòng)作時(shí)間
 private int mRotateDegrees;//旋轉(zhuǎn)的角度
 private Handler mRotate;
 private int mWidth;
 private int mHeight;
 private float mCenterX;
 private float mCenterY;
 private RectF rectF;
 private Bitmap mBitmapCover;
 private float mCoverScale;
 private BitmapShader mShader;
 private Paint paint;
 private boolean isRotating;
 private final Runnable mRunnableRotate = new Runnable() {
  @Override
  public void run() {
   if (isRotating) {
    updateCoverRotate();
    mRotate.postDelayed(mRunnableRotate, ROTATE_DELAY);
   }
  }
 };

 /**
  * 更新封面角度,重新繪制圖片
  */

 private void updateCoverRotate() {
  mRotateDegrees += 1;
  mRotateDegrees = mRotateDegrees % 360;
  postInvalidate();
 }

 /**
  * 判讀是否在旋轉(zhuǎn)
  * @return
  */
 public boolean isRotating() {
  return isRotating;
 }

 /**
  * 開始旋轉(zhuǎn)圖片
  */
 public void start(){
  isRotating=true;
  mRotate.removeCallbacksAndMessages(null);
  mRotate.postDelayed(mRunnableRotate,ROTATE_DELAY);
  postInvalidate();
 }

 /**
  * 停止圖片旋轉(zhuǎn)
  */
 public void stop(){
  isRotating = false;
  postInvalidate();
 }

 /**
  * 通過本地圖片設(shè)置封面圖
  */
 public void setCoverDrawable(int coverDrawable) {
  Drawable drawable = getContext().getResources().getDrawable(coverDrawable);
  mBitmapCover = drawableToBitmap(drawable);
  createShader();
  postInvalidate();
 }
 /**
  * 網(wǎng)絡(luò)圖片加載使用Picasso圖片加載工具
  *
  * @param imageUrl
  */
 public void setCoverURL(String imageUrl) {
  Picasso.with(getContext()).load(imageUrl).into(target);
 }

 public MusicPlayerView(Context context) {
  super(context);
  init(context, null);
 }

 public MusicPlayerView(Context context, AttributeSet attrs) {
  super(context, attrs);
  init(context, attrs);
 }

 public MusicPlayerView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  init(context, attrs);
 }

 /**
  * 初始化View資源
  *
  * @param context
  * @param attrs
  */
 private void init(Context context, AttributeSet attrs) {
  setWillNotDraw(false);
  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.play_view);
  Drawable mDrawableCover = a.getDrawable(R.styleable.play_view_cover);
  if (mDrawableCover != null) {
   mBitmapCover = drawableToBitmap(mDrawableCover);
  }
  a.recycle();
  mRotateDegrees = 0;
  //通過handler更新圖片角度
  mRotate = new Handler();
  rectF = new RectF();
 }

 /**
  * 測量寬高,設(shè)置中心點(diǎn)中心點(diǎn)位置,創(chuàng)建陰影
  *
  * @param widthMeasureSpec
  * @param heightMeasureSpec
  */

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  mWidth = MeasureSpec.getSize(widthMeasureSpec);
  mHeight = MeasureSpec.getSize(heightMeasureSpec);
  int minSide = Math.min(mWidth, mHeight); //取寬高最小值設(shè)置圖片寬高
  mWidth = minSide;
  mHeight = minSide;
  setMeasuredDimension(mWidth, mHeight);  //重新設(shè)置寬高
  //中心點(diǎn)位置
  mCenterX = mWidth / 2f;
  mCenterY = mHeight / 2f;
  //設(shè)置圖片顯示位置
  rectF.set(20.0f, 20.0f, mWidth - 20.0f, mHeight - 20.0f);
  createShader();
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  if (mShader == null) {
   return;
  }
  //畫封面圖片 判讀圖片的中心距離xy,算出邊角大小,然后畫圓
  float radius = mCenterX <= mCenterY ? mCenterX - 75.0f : mCenterY - 75.0f;
  canvas.rotate(mRotateDegrees, mCenterX, mCenterY);
  canvas.drawCircle(mCenterX, mCenterY, radius, paint);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:

    break;
  }
  return super.onTouchEvent(event);
 }


 private Target target = new Target() {
  @Override
  public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
   mBitmapCover = bitmap;
   createShader();
   postInvalidate();
  }

  @Override
  public void onBitmapFailed(Drawable errorDrawable) {

  }

  @Override
  public void onPrepareLoad(Drawable placeHolderDrawable) {

  }
 };
 private int mCoverColor = Color.YELLOW;

 private void createShader() {
  if (mWidth == 0) {
   return;
  }
  if (mBitmapCover == null) { //如果封面為為創(chuàng)建默認(rèn)顏色
   mBitmapCover = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
   mBitmapCover.eraseColor(mCoverColor);
  }
  mCoverScale = ((float) mWidth) / (float) mBitmapCover.getWidth();
  //創(chuàng)建縮放后的bitmap
  mBitmapCover = Bitmap.createScaledBitmap(mBitmapCover,
    (int) (mBitmapCover.getWidth() * mCoverScale), (int) (mBitmapCover.getHeight() * mCoverScale), true);
  mShader = new BitmapShader(mBitmapCover, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  paint = new Paint();
  paint.setAntiAlias(true);
  paint.setShader(mShader);
 }

 /**
  * 將drawable轉(zhuǎn)換為位圖 為BitmapShader準(zhǔn)備
  *
  * @param drawable
  * @return
  */
 private Bitmap drawableToBitmap(Drawable drawable) {
  if (drawable instanceof BitmapDrawable) {
   return ((BitmapDrawable) drawable).getBitmap();
  }
  int width = drawable.getIntrinsicWidth();
  width = width > 0 ? width : 1;
  int height = drawable.getIntrinsicHeight();
  height = height > 0 ? height : 1;
  Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(bitmap);
  drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
  drawable.draw(canvas);
  return bitmap;
 }
}

2.差點(diǎn)忘記一個(gè)attrs屬性

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="play_view">
  <attr name="cover" format="integer"/>
 </declare-styleable>
</resources>

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android路由框架Router分析詳解

    Android路由框架Router分析詳解

    本篇文章主要介紹了Android路由框架Router分析詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Android客戶端與服務(wù)端交互

    Android客戶端與服務(wù)端交互

    這篇文章主要為大家詳細(xì)介紹了Android客戶端與服務(wù)端交互之登陸示例,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 操作SD卡中文件夾和文件的方法

    操作SD卡中文件夾和文件的方法

    操作SD卡中文件夾和文件的方法,需要的朋友可以參考一下
    2013-04-04
  • Android Adapter的幾個(gè)常用方法

    Android Adapter的幾個(gè)常用方法

    這篇文章主要為大家詳細(xì)介紹了Android Adapter的幾個(gè)常用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android中正確使用字體圖標(biāo)(iconfont)的方法

    Android中正確使用字體圖標(biāo)(iconfont)的方法

    IconFont字體不僅僅流行于Web開發(fā),在移動(dòng)開發(fā)中也漸漸的使用的范圍更廣泛。這篇文章主要介紹了在Android開發(fā)中使用icon font的代碼和方法。對(duì)大家學(xué)習(xí)使用iconfont有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 淺析Android中強(qiáng)大的Dialog

    淺析Android中強(qiáng)大的Dialog

    下面將通過一個(gè)小實(shí)例,來像大家展示Android功能強(qiáng)大的Dialog,代碼都寫了詳細(xì)的注釋,讀者不妨試著手動(dòng)去敲
    2013-10-10
  • android Launcher AppWidget添加步驟介紹

    android Launcher AppWidget添加步驟介紹

    大家好,本篇文章主要講的是android Launcher AppWidget添加步驟介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • android 布局屬性詳解

    android 布局屬性詳解

    android 布局屬性詳解,需要的朋友可以參考下
    2013-01-01
  • Android布局優(yōu)化之ViewStub控件

    Android布局優(yōu)化之ViewStub控件

    ViewStub是一個(gè)非常輕量級(jí)的View,這篇文章主要為大家詳細(xì)介紹了Android布局優(yōu)化之ViewStub控件的使用方法以及注意事項(xiàng),感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android編程之菜單的實(shí)現(xiàn)方法實(shí)例詳解

    Android編程之菜單的實(shí)現(xiàn)方法實(shí)例詳解

    這篇文章主要介紹了Android編程之菜單的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了上下文菜單、選項(xiàng)菜單和子菜單的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

宜阳县| 丹棱县| 富阳市| 邯郸市| 黑龙江省| 德令哈市| 鲁甸县| 远安县| 金乡县| 鹿邑县| 汾西县| 宾川县| 吉安市| 奇台县| 沭阳县| 通州市| 永登县| 兴业县| 祥云县| 荆门市| 砚山县| 伊金霍洛旗| 景东| 长沙县| 阳泉市| 平陆县| 禹城市| 凤山市| 宽甸| 吉林省| 新民市| 金寨县| 丰城市| 靖江市| 沙洋县| 彭山县| 蕉岭县| 进贤县| 沾化县| 忻州市| 方正县|