国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義View實現QQ音樂中圓形旋轉碟子

2019-12-12 05:08:32
字體:
來源:轉載
供稿:網友

QQ音樂中圓形旋轉碟子

思路分析:
1、在onMeasure中測量整個View的寬和高后,設置寬高
2、獲取我們res的圖片資源后,在ondraw方法中進行繪制圓形圖片
3、通過Handler發送Runnable來啟動旋轉線程(如果只想做圓形頭像的話,這步可以去掉)
4、在布局中使用我們的View

效果圖:


貼出我們的變量信息:

//view的寬和高 int mHeight = 0; int mWidth = 0; //圓形圖片 Bitmap bitmap = null; //圓形圖片的真實半徑 int radius = 0; //旋轉動畫的矩形 Matrix matrix = new Matrix(); //旋轉動畫的角度 int degrees = 0; 

步驟一:測量整個View的寬和高后,設置寬高

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  super.onMeasure(widthMeasureSpec, heightMeasureSpec);  //測量整個View的寬和高  mWidth = measuredWidth(widthMeasureSpec);  mHeight= measuredHeight(heightMeasureSpec);  setMeasuredDimension(mWidth, mHeight); }  private int measuredWidth(int widthMeasureSpec) {  int Mode = MeasureSpec.getMode(widthMeasureSpec);  int Size = MeasureSpec.getSize(widthMeasureSpec);  if (Mode == MeasureSpec.EXACTLY) {   mWidth = Size;  } else {   //由圖片決定寬度   int value = getPaddingLeft() + getPaddingRight() + bitmap.getWidth();   if (Mode == MeasureSpec.AT_MOST) {    //由圖片和Padding決定寬度,但是不能超過View的寬    mWidth = Math.min(value, Size);   }  }  return mWidth; }  private int measuredHeight(int heightMeasureSpec) {  int Mode = MeasureSpec.getMode(heightMeasureSpec);  int Size = MeasureSpec.getSize(heightMeasureSpec);  if (Mode == MeasureSpec.EXACTLY) {   mHeight = Size;  } else {   //由圖片決定高度   int value = getPaddingTop() + getPaddingBottom() + bitmap.getHeight();   if (Mode == MeasureSpec.AT_MOST) {    //由圖片和Padding決定高度,但是不能超過View的高    mHeight = Math.min(value, Size);   }  }  return mHeight; } 

步驟二:獲取我們res的圖片資源后,在ondraw方法中進行繪制圓形圖片

//獲取res的圖片資源 bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); @Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  canvas.concat(matrix);  //真實的半徑必須是View的寬高最小值  radius = Math.min(mWidth, mHeight);  //如果圖片本身寬高太大,進行相應的縮放  bitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, false);  //畫圓形圖片  canvas.drawBitmap(createCircleImage(bitmap, radius), 0, 0, null);  matrix.reset(); }  private Bitmap createCircleImage(Bitmap source, int radius) {  Paint paint = new Paint();  paint.setAntiAlias(true);  Bitmap target = Bitmap.createBitmap(radius, radius, Bitmap.Config.ARGB_8888);  //產生一個同樣大小的畫布  Canvas canvas = new Canvas(target);  //首先繪制圓形  canvas.drawCircle(radius / 2, radius / 2, radius / 2, paint);  //使用SRC_IN模式顯示后畫圖的交集處  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));  //繪制圖片,從(0,0)畫  canvas.drawBitmap(source, 0, 0, paint);  return target; } 

步驟三:通過Handler發送Runnable來啟動旋轉線程

//開始旋轉 mHandler.post(runnable); [java] view plain copy 在CODE上查看代碼片派生到我的代碼片//-----------旋轉動畫----------- Handler mHandler = new Handler(); Runnable runnable = new Runnable() {  @Override  public void run() {   matrix.postRotate(degrees++, radius / 2, radius / 2);   //重繪   invalidate();   mHandler.postDelayed(runnable, 50);  } }; 

步驟四:在布局中使用我們的View

<com.handsome.cycle.MyCycleView  android:layout_width="wrap_content"  android:layout_height="wrap_content" /> 

下面是整個類的源碼

public class MyCycleView extends View {   //view的寬和高  int mHeight = 0;  int mWidth = 0;  //圓形圖片  Bitmap bitmap = null;  //圓形圖片的真實半徑  int radius = 0;  //旋轉動畫的矩形  Matrix matrix = new Matrix();  //旋轉動畫的角度  int degrees = 0;   //-----------旋轉動畫-----------  Handler mHandler = new Handler();  Runnable runnable = new Runnable() {   @Override   public void run() {    matrix.postRotate(degrees++, radius / 2, radius / 2);    //重繪    invalidate();    mHandler.postDelayed(runnable, 50);   }  };   public MyCycleView(Context context) {   super(context);   initView();  }   public MyCycleView(Context context, AttributeSet attrs) {   super(context, attrs);   initView();  }   public MyCycleView(Context context, AttributeSet attrs, int defStyleAttr) {   super(context, attrs, defStyleAttr);   initView();  }   public void initView() {   //獲取res的圖片資源   bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);   //開始旋轉   mHandler.post(runnable);  }   @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {   super.onMeasure(widthMeasureSpec, heightMeasureSpec);   //測量整個View的寬和高   mWidth = measuredWidth(widthMeasureSpec);   mHeight = measuredHeight(heightMeasureSpec);   setMeasuredDimension(mWidth, mHeight);  }   private int measuredWidth(int widthMeasureSpec) {   int Mode = MeasureSpec.getMode(widthMeasureSpec);   int Size = MeasureSpec.getSize(widthMeasureSpec);   if (Mode == MeasureSpec.EXACTLY) {    mWidth = Size;   } else {    //由圖片決定寬度    int value = getPaddingLeft() + getPaddingRight() + bitmap.getWidth();    if (Mode == MeasureSpec.AT_MOST) {     //由圖片和Padding決定寬度,但是不能超過View的寬     mWidth = Math.min(value, Size);    }   }   return mWidth;  }   private int measuredHeight(int heightMeasureSpec) {   int Mode = MeasureSpec.getMode(heightMeasureSpec);   int Size = MeasureSpec.getSize(heightMeasureSpec);   if (Mode == MeasureSpec.EXACTLY) {    mHeight = Size;   } else {    //由圖片決定高度    int value = getPaddingTop() + getPaddingBottom() + bitmap.getHeight();    if (Mode == MeasureSpec.AT_MOST) {     //由圖片和Padding決定高度,但是不能超過View的高     mHeight = Math.min(value, Size);    }   }   return mHeight;  }   @Override  protected void onDraw(Canvas canvas) {   super.onDraw(canvas);   canvas.concat(matrix);   //真實的半徑必須是View的寬高最小值   radius = Math.min(mWidth, mHeight);   //如果圖片本身寬高太大,進行相應的縮放   bitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, false);   //畫圓形圖片   canvas.drawBitmap(createCircleImage(bitmap, radius), 0, 0, null);   matrix.reset();  }   private Bitmap createCircleImage(Bitmap source, int radius) {   Paint paint = new Paint();   paint.setAntiAlias(true);   Bitmap target = Bitmap.createBitmap(radius, radius, Bitmap.Config.ARGB_8888);   //產生一個同樣大小的畫布   Canvas canvas = new Canvas(target);   //首先繪制圓形   canvas.drawCircle(radius / 2, radius / 2, radius / 2, paint);   //使用SRC_IN模式顯示后畫圖的交集處   paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));   //繪制圖片,從(0,0)畫   canvas.drawBitmap(source, 0, 0, paint);   return target;  } } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 松潘县| 介休市| 新源县| 新巴尔虎左旗| 阿图什市| 淮北市| 迁安市| 申扎县| 平罗县| 莱西市| 青冈县| 门源| 莱芜市| 清涧县| 巫山县| 迁安市| 玉屏| 横峰县| 绥宁县| 佛坪县| 滁州市| 奎屯市| 恩施市| 密云县| 江陵县| 泸州市| 锦屏县| 奉贤区| 府谷县| 镇坪县| 名山县| 会同县| 黄龙县| 稻城县| 宁乡县| 林西县| 大埔县| 瑞丽市| 昌吉市| 汝阳县| 大足县|