返回顶部
首页 > 资讯 > 精选 >怎么在Android应用中利用View实现一个旋转功能
  • 542
分享到

怎么在Android应用中利用View实现一个旋转功能

androidviewroi 2023-05-31 08:05:01 542人浏览 泡泡鱼
摘要

本篇文章为大家展示了怎么在Android应用中利用View实现一个旋转功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。添加右侧旋转Bitmap turnBitmap =&nbs

本篇文章为大家展示了怎么在Android应用中利用View实现一个旋转功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

添加右侧旋转

Bitmap turnBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.fengshan, null)).getBitmap(); int turnLeafAngle = 0; private void setTurnLeaf(canvas canvas) {  Matrix matrix = new Matrix();  turnLeafAngle = turnLeafAngle + 3;  matrix.postTranslate((width - rightCircleWidth/2 - turnBitmap.getWidth()/2),    (height - rightCircleWidth/2 - turnBitmap.getHeight()/2));  matrix.postRotate(turnLeafAngle,      width - rightCircleWidth/2 - turnBitmap.getWidth()/2 + turnBitmap.getWidth()/2,     height - rightCircleWidth/2 - turnBitmap.getHeight()/2 + turnBitmap.getHeight()/2);  canvas.drawBitmap(turnBitmap, matrix, new Paint()); }

代码很明确,首先通过Matrix.postTranslate(float dx, float dy)把turnBitMap定位到最右侧圆圈

再通过Matrix.postRotate(float degress, float dx, float dy);设置旋转角度,每次角度+3°

其中degress为旋转角度,(dx,dy)为旋转中心点坐标

添加滑动效果

a、定义一个圆形Rectf(为什么不是半圆?因为画圆弧的其实角度从水平线右侧开始)

progressArcRectf = new RectF(0, 0, height, height);

b、定义一个长方形Rectf,长方形x坐标起点即时圆形半径

progressRectf = new RectF(height/2,  0, width, height);

c、画出圆弧Canvas.drawArc(Rectf rectf, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

startAngle:起始角度,默认从右侧水平线开始

sweepAngle:为旋转的角度,顺时针旋转

useCenter:true只画出弧线,false则画出圆心到弧线的区域

//画滑动后的背景条int currentProgressWidht = currentProgress * (width - borderWidth)/100;if(currentProgressWidht < leftCircleWidth/2) {  //angle取值范围0~90  int angle = 90 * currentProgressWidht / (leftCircleWidth/2);  // 起始的位置  int startAngle = 180 - angle;  // 扫过的角度  int sweepAngle = 2 * angle;  canvas.drawArc(progressArcRectf, startAngle, sweepAngle, false, progressBgPaint);}else {  //画左边半圆形滑过部分  canvas.drawArc(progressArcRectf, 90, 180, false, progressBgPaint);  progressRectf.left = borderWidth + leftCircleWidth/2;  progressRectf.right = borderWidth + currentProgressWidht;  //画中间滑过部分  canvas.drawRect(progressRectf, progressBgPaint); }

给LeafView.java添加一个

 public void setCurrentProgress(int currentProgress) {  this.currentProgress = currentProgress; }

修复叶子飘动范围

这个简单,就是设置叶子的rect坐标起点+边框距离

赋上所有代码

activity_leaf.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="Http://schemas.android.com/apk/res/android" android:id="@+id/content_leaf" android:layout_width="match_parent" android:layout_height="match_parent">  <RelativeLayout   android:layout_width="226dp"   android:layout_height="45dp">    <com.zjcpo.t170313_countdowntimer.LeafView     android:id="@+id/leafView"     android:layout_width="226dp"     android:layout_height="45dp"     android:layout_centerHorizontal="true"     />  </RelativeLayout></RelativeLayout>

LeafView.java

import android.content.Context;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.drawable.BitmapDrawable;import android.util.AttributeSet;import android.util.Log;import android.view.View;import java.util.LinkedList;import java.util.List;import java.util.Random;import java.util.jar.Attributes;public class LeafView extends View { private String TAG = "--------LeafView"; private Resources mResources; //背景图、叶子 private Bitmap mLeafBitmap, bgBitmap, turnBitmap; //整个控件的宽度和高度 private int width, height; //最外层边框宽度 private int borderWidth; //右侧圆形直径 private int rightCircleWidth; //左侧圆形直径 private int leftCircleWidth; private Paint bgPaint; private RectF bgRect; private Rect bgDestRect; //进度条实时背景 private Paint progressBgPaint; //进度条左侧半圆,进度条中间长方形部分Rect private RectF progressArcRectf, progressRectf; //当前百分比0~100 private int currentProgress = 0; //存放叶子lsit private List<Leaf> leafList; //叶子的宽和高 private int mLeafWidth, mLeafHeight; //叶子滑动一周的时间5秒 private final static long cycleTime = 5000; //叶子数量 private final static int leafNumber = 6; public LeafView(Context context, AttributeSet attrs) {  super(context, attrs);  mResources = getResources();  mLeafBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf, null)).getBitmap();  mLeafWidth = mLeafBitmap.getWidth();  mLeafHeight = mLeafBitmap.getHeight();  turnBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.fengshan, null)).getBitmap();  bgBitmap = ((BitmapDrawable) mResources.getDrawable(R.drawable.leaf_kuang, null)).getBitmap();  bgPaint = new Paint();  bgPaint.setColor(mResources.getColor(R.color.bg_color));  //进度条实时背景  progressBgPaint = new Paint();  progressBgPaint.setColor(mResources.getColor(R.color.progress_bg_color));  //获取所有叶子的信息,放入list  leafList = getLeafs(leafNumber); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {  super.onSizeChanged(w, h, oldw, oldh);  width = w;  height = h;  borderWidth = height * 10/64;  rightCircleWidth = width * 62/303;  leftCircleWidth = height - 2 * borderWidth;  bgDestRect = new Rect(0, 0 , width, height);  bgRect = new RectF(0, 0 , width, height);  progressArcRectf = new RectF(borderWidth, borderWidth, height - borderWidth, height - borderWidth);  progressRectf = new RectF(borderWidth+(height-2*borderWidth)/2, borderWidth,          width-rightCircleWidth/2, height-borderWidth);  Log.i("leftMarginWidth", (borderWidth + leftCircleWidth/2) + ""); } @Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  //画背景颜色到画布  canvas.drawRect(bgRect, bgPaint);  if(currentProgress <= 100) {   //画叶子   int size = leafList.size();   for (int i=0; i<size; i++) {    Leaf leaf = leafList.get(i);    //获取叶子坐标    getLocation(leaf);    //获取叶子旋转角度    getRotate(leaf);    canvas.save();    Matrix matrix = new Matrix();    //设置滑动    matrix.postTranslate(leaf.x, leaf.y);    //设置旋转    matrix.postRotate(leaf.rotateAngle, leaf.x + mLeafWidth / 2, leaf.y + mLeafHeight / 2);    //添加叶子到画布    canvas.drawBitmap(mLeafBitmap, matrix, new Paint());    canvas.restore();    //画滑动后的背景条    int currentProgressWidht = currentProgress * (width - borderWidth - rightCircleWidth/2)/100;    if(currentProgressWidht < leftCircleWidth/2) {     //angle取值范围0~90     int angle = 90 * currentProgressWidht / (leftCircleWidth/2);     Log.i(TAG, "angle :" + angle);     // 起始的位置     int startAngle = 180 - angle;     // 扫过的角度     int sweepAngle = 2 * angle;     canvas.drawArc(progressArcRectf, startAngle, sweepAngle, false, progressBgPaint);    }else {     //画左边半圆形滑过部分     canvas.drawArc(progressArcRectf, 90, 180, false, progressBgPaint);     progressRectf.left = borderWidth + leftCircleWidth/2;     progressRectf.right = borderWidth + currentProgressWidht;     //画中间滑过部分     canvas.drawRect(progressRectf, progressBgPaint);    }   }   //调用onDraw()重复滑动   if(currentProgress < 100) {    postInvalidate();   }  }  //画背景图片到画布  canvas.drawBitmap(bgBitmap, null, bgDestRect, null);  //画右边选择风叶  setTurnLeaf(canvas);  //画百分比  setText(canvas); } int turnLeafAngle = 0; private void setTurnLeaf(Canvas canvas) {  Matrix matrix = new Matrix();  turnLeafAngle = turnLeafAngle + 3;  matrix.postTranslate((width - rightCircleWidth/2 - turnBitmap.getWidth()/2),       (height - rightCircleWidth/2 - turnBitmap.getHeight()/2));  matrix.postRotate(turnLeafAngle,       width - rightCircleWidth/2 - turnBitmap.getWidth()/2 + turnBitmap.getWidth()/2,       height - rightCircleWidth/2 - turnBitmap.getHeight()/2 + turnBitmap.getHeight()/2);  canvas.drawBitmap(turnBitmap, matrix, new Paint()); } //显示百分比数字,大于3%开始显示,到50%停止滑动 private void setText(Canvas canvas) {  Paint paintText = new Paint();  paintText.setColor(Color.WHITE);  paintText.setTextSize(30);  int textX = currentProgress * width / 100;  textX = currentProgress < 50 ? (currentProgress * width / 100) : (width/2);  if(currentProgress > 3) {   canvas.drawText(currentProgress + "%", textX, height/2 + 10,paintText);  } } //获取每片叶子在XY轴上的滑动值 private void getLocation(Leaf leaf) {  float betweenTime = leaf.startTime - System.currentTimeMillis();  //周期结束再加一个cycleTime  if(betweenTime < 0) {   leaf.startTime = System.currentTimeMillis() + cycleTime + new Random().nextInt((int) (cycleTime));   betweenTime = cycleTime;  }  //通过时间差计算出叶子的坐标  float fraction = (float) betweenTime / cycleTime;  float x = (int)(width * fraction);  //防止叶子飘出边框  leaf.x = x < borderWidth ? borderWidth : x;  float w = (float) ((float) 2 * Math.PI / width);  int y = (int) (18 * Math.sin(w * x)) + (height-mLeafHeight)/2;  //防止叶子飘出边框  y = y > (height - borderWidth) ? (height - borderWidth) : y;  y = y < borderWidth ? borderWidth : y;  leaf.y = y; } //获取每片叶子的旋转角度 private void getRotate(Leaf leaf) {  float scale = ((leaf.startTime - System.currentTimeMillis())%cycleTime)/ (float)cycleTime;  int rotate = (int)(scale * 360);  leaf.rotateAngle = rotate; } private class Leaf {  // 叶子的坐标  float x, y;  // 旋转角度  int rotateAngle;  // 起始时间(ms)  long startTime; } private List<Leaf> getLeafs(int leafSize) {  List<Leaf> list = new LinkedList<Leaf>();  for (int i=0; i<leafSize; i++) {   list.add(getLeaf());  }  return list; } //使叶子初始时间有间隔 int addTime; private Leaf getLeaf() {  Random random = new Random();  Leaf leaf = new Leaf();  leaf.rotateAngle = random.nextInt(360);  addTime += random.nextInt((int) (cycleTime));  leaf.startTime = System.currentTimeMillis() + cycleTime + addTime;  return leaf; } public void setCurrentProgress(int currentProgress) {  this.currentProgress = currentProgress; }}3、LeafActivity.javapublic class LeafActivity extends Activity { private LeafView leafView; private int mProgress = 0; Handler mHandler = new Handler() {  public void handleMessage(Message msg) {   if (mProgress < 40) {    mProgress += 1;    // 随机800ms以内刷新一次    mHandler.sendEmptyMessageDelayed(1,      new Random().nextInt(800));    leafView.setCurrentProgress(mProgress);   } else {    mProgress += 1;    // 随机1200ms以内刷新一次    mHandler.sendEmptyMessageDelayed(1,      new Random().nextInt(100));    leafView.setCurrentProgress(mProgress);   }  }; }; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_leaf);  leafView = (LeafView) findViewById(R.id.leafView);  mHandler.sendEmptyMessageDelayed(1, 3000); }}

上述内容就是怎么在Android应用中利用View实现一个旋转功能,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么在Android应用中利用View实现一个旋转功能

本文链接: https://lsjlt.com/news/224494.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在Android应用中利用View实现一个旋转功能
    本篇文章为大家展示了怎么在Android应用中利用View实现一个旋转功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。添加右侧旋转Bitmap turnBitmap =&nbs...
    99+
    2023-05-31
    android view roi
  • 怎么在Android应用中利用View实现一个倒计时功能
    这篇文章将为大家详细讲解有关怎么在Android应用中利用View实现一个倒计时功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Android 自定义View实现倒计时需求:具体方法如下:...
    99+
    2023-05-31
    android roi view
  • 怎么在android应用中利用view实现一个拖拽删除功能
    这期内容当中小编将会给大家带来有关怎么在android应用中利用view实现一个拖拽删除功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。功能有以下几个特点:在开始的时候点击圆以外的区域不会触发拖动事件点...
    99+
    2023-05-31
    android roi view
  • 怎么在Android应用中利用Bitmap实现一个位图旋转效果
    怎么在Android应用中利用Bitmap实现一个位图旋转效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。位图的旋转也可以借助Matrix或者Canvas来实现。通过po...
    99+
    2023-05-31
    android bitmap roi
  • 怎么在Android中利用IntentUtil实现一个跳转功能
    本文章向大家介绍怎么在Android中利用IntentUtil实现一个跳转功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统...
    99+
    2023-05-30
    android intentutil
  • 如何在Android中利用view实现一个手势密码功能
    这篇文章将为大家详细讲解有关如何在Android中利用view实现一个手势密码功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用法: <com.leo.library.view.Ge...
    99+
    2023-05-31
    android roi view
  • 怎么在Android应用中利用ActionBar实现一个导航栏功能
    怎么在Android应用中利用ActionBar实现一个导航栏功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Action Bar是一种新増的导航栏功能,在Android 3...
    99+
    2023-05-31
    android actionbar roi
  • 如何在Android中利用View实现一个等级滑动条功能
    这篇文章将为大家详细讲解有关如何在Android中利用View实现一个等级滑动条功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。思路: 首先绘制直线,然后等分直线绘制点; 绘制点...
    99+
    2023-05-31
    android view roi
  • 怎么在Android应用中利用PopuWindow实现一个下拉列表功能
    这篇文章将为大家详细讲解有关怎么在Android应用中利用PopuWindow实现一个下拉列表功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基础依赖,由于下拉列表是用RecycleVie...
    99+
    2023-05-31
    popuwindow roi android
  • 怎么在Android应用中利用TextSwitcher实现一个上下滚动功能
    本篇文章为大家展示了怎么在Android应用中利用TextSwitcher实现一个上下滚动功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android 上下滚动TextSwitcher实例详解1...
    99+
    2023-05-31
    android textswitcher roi
  • 怎么在Android应用中利用textview实现一个长按复制功能
    这篇文章将为大家详细讲解有关怎么在Android应用中利用textview实现一个长按复制功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。这里有一个大坑,我的viewGroup中有一个这个...
    99+
    2023-05-31
    textview android roi
  • 怎么在Android应用中利用RecyclerView实现一个分页滚动功能
    怎么在Android应用中利用RecyclerView实现一个分页滚动功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、需求分析最近公司项目要实现一个需求要满足以下功能...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么在Android应用中利用控件实现一个对话框功能
    怎么在Android应用中利用控件实现一个对话框功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。自定义提示对话框DialogM.Builder builder&nb...
    99+
    2023-05-31
    android roi
  • 怎么在Android 应用中实现一个换肤功能
    今天就跟大家聊聊有关怎么在Android 应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android换肤技术总结背景纵观现在各种Android app,其换肤...
    99+
    2023-05-31
    android roi
  • 怎么在Android应用中实现一个跳转到主界面功能
    怎么在Android应用中实现一个跳转到主界面功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。//homeIntent intent= new Intent(Intent.A...
    99+
    2023-05-31
    android roi
  • 怎么在Android中利用view实现一个太极效果
    怎么在Android中利用view实现一个太极效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Android自定义view实现太极效果实例代码之前一直想要个加载的load...
    99+
    2023-05-31
    android view roi
  • 如何在Android应用中利用ListView实现一个分页功能
    今天就跟大家聊聊有关如何在Android应用中利用ListView实现一个分页功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android ListView分页简单实现分页,开发...
    99+
    2023-05-31
    android listview roi
  • 如何在Android应用中利用SDK实现一个地图功能
    这期内容当中小编将会给大家带来有关如何在Android应用中利用SDK实现一个地图功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。找到控制台创建一个应用添加key名称,注意命名规范,还有就是下面的SHA...
    99+
    2023-05-31
    android sdk roi
  • 如何在Android中利用Intent实现一个页面跳转功能
    本篇文章为大家展示了如何在Android中利用Intent实现一个页面跳转功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Intent实现页面之间跳转1、无返回值startActivity(int...
    99+
    2023-05-30
    android intent
  • 怎么在Android中利用CountDownTimer实现一个倒计时功能
    这篇文章主要介绍了怎么在Android中利用CountDownTimer实现一个倒计时功能,此处通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:Android是什么Android是一种基于Lin...
    99+
    2023-05-30
    android countdowntimer
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作