android之cpu使用率曲线效果的实现!

最近做一个效果:在手机设置里面“关于手机”里面添加一项来显示当前手机cpu使用率的曲线!其实现效果如下图所示:

上图关于手机的第一项就是我要实现的效果!今天来讲讲这个曲线的view(cpu_speedcurve_view)是如何实现的!

首先要注意以下几点:

(1)由于我设计的cpu_speedcurve_view不仅仅显示动态的曲线,还需要用textview显示一些cpu相关信息!所以,我选择cpu_speedcurve_view继承一个viewgroup,这里我选择的是FrameLayout

(3)曲线的怎么绘制?

这里我是在cpu_speedcurve_view的public void draw(Canvas canvas)里面用Canvas的drawPath来绘制的。具体代码如下:

	public void draw(Canvas canvas) {
		super.draw(canvas);

		//mPaint.setColor(coordinateColor);
		//mPaint.setStrokeWidth(mStrokeSize*2);
		//canvas.drawPath(m_path_coordinate, mPaint);
		//canvas.clipRect(10, 10, 5, 5);
		if(flag_start){
			if(m_path_0 == null && m_path_1 == null){
				//Start_run_CpuTracker_to_show_curve();
			}else{
				mPaint.setColor(curveColor);
				mPaint.setStrokeWidth(mStrokeSize);

				if(m_path_0 != null){
					// Log.d("speedcurve", "cpu_speedcurve_view  draw  (m_path != null) ");
					if(!m_path_0.isEmpty()){
						canvas.drawPath(m_path_0, mPaint);
					}
				}
				if(m_path_1 != null){
					// Log.d("speedcurve", "cpu_speedcurve_view  draw  (m_path != null) ");
					if(!m_path_1.isEmpty()){
						canvas.drawPath(m_path_1, mPaint);
					}
				}

			}
		}

	}

从上面代码可以看到,这里居然有两个Path,从上面的效果图可以看出只是一条曲线呀!为什么这里有两个Path呢?

	private Path m_path_0;
	private Path m_path_1;

的确我定义了两个Path,那是因为一个Path的曲线长度不是无线的,总是会溢出的!所以我就设计了两个曲线(Path),当m_path_0使用一段时间后,就启动另一个曲线m_path_1,使其重叠显示,直到m_path_1长度超过这个view显示的宽度时候,把m_path_0给清除掉。整个运行的机制就是这样反复。

(2)对于曲线的动态显示,我的办法是定义一个Handler定时的自动发送信息来更新cpu运行的数据,最后用invalidate();来刷新曲线:

	private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 000:
					m_CpuTracker.update();
					TotalCpuPercent = m_CpuTracker.getTotalCpuPercent();
					int h = view_h - 2;

					//int CpuPercent_po = (int) (h * TotalCpuPercent);
					if(flag_num < 400){
						if(m_path_0 == null){
							m_path_0 = new Path();
							m_path_0.moveTo(view_w+4, h - TotalCpuPercent);
						}

						if(flag_num > 200){
							if(m_path_1 == null){
								m_path_1 = new Path();
								m_path_1.moveTo(view_w+4, h - TotalCpuPercent);
							}

						}else{
							m_path_1 = null;
						}
					}else if(flag_num < 600){
						m_path_0 = null;
						if(m_path_1 == null){
							m_path_1 = new Path();
							m_path_1.moveTo(view_w+4, h - TotalCpuPercent);
						}

					}else if(flag_num < 800){
						if(m_path_0 == null){
							m_path_0 = new Path();
							m_path_0.moveTo(view_w+4, h - TotalCpuPercent);
						}

					}else{
						flag_num = 0;
					}

					if(m_path_0 != null){
						m_path_0.lineTo(view_w+4, h - TotalCpuPercent);
						matrix.setTranslate(-4,0);
						m_path_0.transform(matrix);
					}

					if(m_path_1 != null){
						m_path_1.lineTo(view_w+4, h - TotalCpuPercent);
						matrix.setTranslate(-4,0);
						m_path_1.transform(matrix);
					}

				//	Log.d("speedcurve", "cpu_speedcurve_view  handleMessage  msg.what=000 flag_num="+flag_num);
				//	Log.d("speedcurve", "cpu_speedcurve_view  handleMessage  TotalCpuPercent="+TotalCpuPercent+"view_h="+view_h+"getCurCpuFreq()="+Cpu_info_manager.getCurCpuFreq());
				    if(flag_start){
						mHandler.sendEmptyMessageDelayed(000,300);
						invalidate();
						flag_num++;
					}else{
						Stop_run_CpuTracker_to_show_curve();
					}
					break;
                case 111: 

                	break;
            }
        }
    };

从上面的代码可以知道:首先获取当前cpu使用的百分率,再通过这个百分率来计算出曲线高度!最后通过path的moveTo来完成曲线的绘制保存。

(3)如何获取cpu的使用率呢?

用android提供的ProcessCpuTracker就可以了。

m_CpuTracker = new ProcessCpuTracker(false);

实际上在ProcessCpuTracker里面就是在/proc/stat 去读取cpu的信息(user time /nice time/sys time/idle time/iowait time等)来计算出使用率的百分比的!

(4)最后记得 在这个里面 protected void onDetachedFromWindow()停止运行就可以了!

就这样问题就基本解决了!如果要实现如上的效果图的则需要定义一个PreferenceGroup:

		PreferenceGroup mCPUStatusPref = (PreferenceGroup) findPreference("cpu_key");
		mCPUStatusPref.setLayoutResource(R.layout.cpu_curve_preference); 

在layout: cpu_curve_preference就可以布局成上面的效果了!

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="85dip"
    android:gravity="center_vertical"
    android:paddingStart="@*android:dimen/preference_item_padding_side"
    android:paddingEnd="?android:attr/scrollbarSize"
    android:background="?android:attr/selectableItemBackground"
    android:paddingTop="6dip"
    android:paddingBottom="6dip">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="6dip"
        android:paddingBottom="6dip">

        <TextView
            android:id="@+android:id/title"
            android:text="@string/XunHu_Setting_Cpu_Info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/usage_type_cpu_foreground"
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:visibility="gone"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="4" />

    </RelativeLayout>

    <com.android.settings.widget.cpu_speedcurve_view
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:minWidth="180dip"
        android:background="@drawable/cpu_curve_bg"
        android:layout_marginBottom="8dip"
        android:layout_marginTop="8dip"
        >

	 <TextView
		 android:id="@+android:id/cpu_speedcurve_view_title"
		 android:text="@string/XunHu_Setting_Cpu_Info_util"
		 android:layout_width="wrap_content"
		 android:layout_height="wrap_content"
		 android:singleLine="true"
		 android:ellipsize="marquee"
		 android:fadingEdge="horizontal" />

	 </com.android.settings.widget.cpu_speedcurve_view>

</LinearLayout>

时间: 2024-10-10 21:47:10

android之cpu使用率曲线效果的实现!的相关文章

Android获取cpu使用率,剩余内存和硬盘容量

1.内存信息 在proc/meminfo下有详细的内存使用情况,我这里获取的内存信息就是从这个文件里获取的.获取到详细的内存信息后根据我自己的需求,从bufferdreader中单独抽取出来了剩余的内存容量. <span style="font-family:Microsoft YaHei;font-size:14px;"> Runtime runtime = Runtime.getRuntime(); Process p; try { p = runtime.exec(C

Android -- 获取CPU使用率

public static float getProcessCpuRate() { float totalCpuTime1 = getTotalCpuTime(); float processCpuTime1 = getAppCpuTime(); try { Thread.sleep(360); } catch (Exception e) { } float totalCpuTime2 = getTotalCpuTime(); float processCpuTime2 = getAppCpuT

生成CPU使用率 sin 曲线 控制cpu使用率 编程之美

入职Oracle 以后想着把之前写过的<编程之美>中控制CPU使用率曲线的程序再写一边, 但是总是因为入职需要学习的东西太多, 没有时间. 程序早就写好了, 终于有机会贴出来了.o(∩∩)o.. 最早的时候我采用C实现的效果并不好, 当时也没有认真调试, 最初的时候采用C#实现的效果反而不错, 因为C#有很多方便的类库可以获取CPU的占用率, 控制sleep时间等等.其实在C中也很容易实现. 总体的算法思想, 这里就不再重复了, 可以参考下面的链接 : http://blog.csdn.net

使用WPF动态显示CPU使用率

使用WPF动态显示CPU使用率 开源框架  admin  9个月前 (07-14)  1337浏览 基于WPF的开源图表控件有很多,大多数都是静态图表,如果需要绘制CPU使用率这样的动态数据就显得力不从心,微软开源的DynamicDataDisplay控件弥补了这个不足,为了做个备忘,我用它来实时绘制CPU使用率曲线,当然,这个控件也可以绘制动态线图.气泡图和热力图,具体可参阅官网示例代码,使用方法非常简单,下面就直接贴代码,文本末尾提供VS2013的示例代码下载. 1.首先需要在项目中引用Dy

zabbix自动发现与监控内存和CPU使用率最高的进程

监控需求 某项目的应用服务器CPU和内存使用率的监控,通过zabbix系统监控记录应用服务器上进程的CPU和内存的使用情况,并以图表的形式实时展现,以便于我们分析服务器的性能瓶颈. 监控方式 利用zabbix监控系统的自动发现功能,首先编写shell脚本获取服务器的CPU和内存资源使用率最大的进程,以json的格式输出,然后对这些进程的CPU和内存资源使用情况进行监控.(本文监控的进程为Linux服务器中资源使用率最高的10个进程.) 缺点 不适用于监控固定的进程 首先使用top命令查看进程状态

玩转CPU运行曲线

Leaf 是不是从来没有想过看看cpu运行曲线啊骚年?顶多也就仅仅是看看cpu利用率,吓自己一跳后感觉关闭几个不该打开的程序~ 然而问题来了,微软公司要让你绘制cpu运行曲线啊!!不仅是固定的直线,还要绝对值函数,还有正弦!!我的天这游戏还能玩? Require 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越简越好,计算机语言不限.例如,可以实现下面三种情况: CPU的占用率固定在50%,为一条直线 CPI的占用率为一条直线,但是具体占用率由命

50个Android开发人员必备UI效果源码[转载]

50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面实现篇Android 仿微信之界面导航篇Android 高仿QQ 好友分组列表Android 高仿QQ 界面滑动效果Android 高仿QQ 登陆界面Android 对Path的旋转效果的拓展Android高仿360安全卫士布局源码Android SlidingDrawer 滑动抽屉效果Androi

Zabbix3.0.4监控Windows的CPU使用百分比并在CPU使用率超过90%触发报警

Zabbix3.0.4监控Windows的CPU使用百分比 Zabbix 自带的模块没有 CPU 使用率(百分比)这个监控项,我们可以通过添加计数器的方式实现 CPU 百分比的监控. 1.在Zabbix 的 WEB 端进行模板配置添加 CPU 百分比监控项目 *. 配置–模块–选择对应的模板–项目–创建项目 名称:CPU 百分比键值:perf_counter[\Processor(_Total)\% Processor Time]数据类型:数字的(浮点)单位:%数据更新间隔(秒):30应用集:C

CPU使用率终于正常了——记一次订餐统事故处理

引子 经过漫长的等待,儿子终于出生了.欣喜之余,就是各种手足无措,顾此失彼了.因为不懂,心里总是慌慌的,有点小毛病,恨不得一步就到医院. 婆媳育儿观念的差异,让心乱如麻的我,又成了风箱里的老鼠,两个不服软的女人都在考验我的智慧,虽是极力从中斡旋,还是免不了爆发了一场婆媳冲突. 还是智慧少了,估计四大名著还得再读一遍(唬一下人应该还是可以的:-D). 不过话说回来了,虽然苦点,累点(当然了,主要还是媳妇和妈累,媳妇放弃工作,放弃辣椒,放弃方便面,也蛮拼了,我也就打打酱油),但抱着娃,看他那惹人爱的