首页 文章 精选 留言 我的

精选列表

搜索[应用接续],共10000篇文章
优秀的个人博客,低调大师

【Android进阶学习】Popupwindow的应用

PopupWindow 是一种阻塞式的弹出窗口,这就意味着在我们退出这个弹出框之前,程序会一直等待。它可以浮动在当前Activity的任何的位置上。 需要注意的是,PopupWindow必须触发某个焦点或者某个事件才会显示出来,不然总会会出现错误。 下面是使用PopupWindow 弹出自定义菜单的例子 当我们点击Menu键的时候,会在当前的Activity最下方弹出一个菜单。 效果图如下: PopupMenuDemo.java packagecom.lingdududu.popupWindow; importandroid.app.Activity; importandroid.content.Context; importandroid.graphics.drawable.BitmapDrawable; importandroid.os.Bundle; importandroid.view.Gravity; importandroid.view.KeyEvent; importandroid.view.LayoutInflater; importandroid.view.Menu; importandroid.view.MenuItem; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.BaseAdapter; importandroid.widget.GridView; importandroid.widget.ImageView; importandroid.widget.LinearLayout; importandroid.widget.PopupWindow; importandroid.widget.TextView; importandroid.widget.LinearLayout.LayoutParams; publicclassPopupMenuDemoextendsActivity{ privateint[]resArray=newint[]{ R.drawable.icon_menu_addto,R.drawable.icon_menu_audioinfo, R.drawable.icon_menu_findlrc,R.drawable.icon_menu_scan }; privateString[]title=newString[]{ "添加","信息","搜索","查看" }; privatePopupWindowpw=null; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override publicbooleanonCreateOptionsMenu(Menumenu){ menu.add(""); returnsuper.onCreateOptionsMenu(menu); } /** *在此方法中实现自定义菜单栏 */ publicbooleanonMenuOpened(intfeatureId,Menumenu){ if(pw!=null){ if(pw.isShowing()){ //就关闭弹出窗口 pw.dismiss(); } else{ //在指定位置弹出窗口 pw.showAtLocation(findViewById(R.id.tv),Gravity.CENTER,0,300); } } else{ LayoutInflaterinflater=(LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); Viewview=inflater.inflate(R.layout.menu,null); GridViewgrid1=(GridView)view.findViewById(R.id.menuGridChange); grid1.setAdapter(newImageAdapter(this)); //生成PopupWindow对象 pw=newPopupWindow(view,LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); //在指定位置弹出窗口 pw.showAtLocation(findViewById(R.id.tv),Gravity.CENTER,0,300); } //此处返回false,系统不会执行onCreateOptionsMenu中添加的菜单 returnfalse; } publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if(keyCode==KeyEvent.KEYCODE_BACK){ pw.dismiss(); returnfalse; } returnsuper.onKeyDown(keyCode,event); } @Override publicbooleanonOptionsItemSelected(MenuItemitem){ returnsuper.onOptionsItemSelected(item); } publicclassImageAdapterextendsBaseAdapter{ privateContextcontext; publicImageAdapter(Contextcontext){ this.context=context; } @Override publicintgetCount(){ returnresArray.length; } @Override publicObjectgetItem(intarg0){ returnresArray[arg0]; } @Override publiclonggetItemId(intarg0){ returnarg0; } @Override publicViewgetView(intarg0,Viewarg1,ViewGrouparg2){ LinearLayoutlinear=newLinearLayout(context); LinearLayout.LayoutParamsparams=newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); linear.setOrientation(LinearLayout.VERTICAL); ImageViewiv=newImageView(context); iv.setImageBitmap(((BitmapDrawable)context.getResources().getDrawable(resArray[arg0])).getBitmap()); LinearLayout.LayoutParamsparams2=newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); params2.gravity=Gravity.CENTER; linear.addView(iv,params2); TextViewtv=newTextView(context); tv.setText(title[arg0]); LinearLayout.LayoutParamsparams3=newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); params3.gravity=Gravity.CENTER; linear.addView(tv,params3); returnlinear; } } } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> menu.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> menu_bg_frame.xml 这个文件是菜单背景的样式文件,在drawable-hdpi文件下面 <?xmlversion="1.0"encoding="UTF-8"?> <shapeandroid:shape="rectangle"xmlns:android="http://schemas.android.com/apk/res/android"> <solidandroid:color="#b4000000"/> <strokeandroid:width="2.0dip"android:color="#b4ffffff"android:dashWidth="3.0dip"android:dashGap="0.0dip"/> <paddingandroid:left="7.0dip"android:top="7.0dip"android:right="7.0dip"android:bottom="7.0dip"/> <cornersandroid:radius="8.0dip"/> </shape> 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/739459

优秀的个人博客,低调大师

docker高级应用之资源监控

最近忙着开发docker平台,所以挺久没有更新博客了,今天给大家分享一下,我开发docker平台里如何监控资源与进行图像展示的。 默认docker 1.5版本有stats命令查看容器的cpu使用率、内存使用量与网络流量,但此功能有2个必须: 1、必须是docker 1.5版本 2、必须使用默认docker0的网桥(如果你使用ovs这样非原生的网桥无法获取数据的) 我开发的监控里docker是1.5版本,并且通过使用ifconfig来获取容器rx或rx量来获取容器流量,解决了必须使用docker默认网桥才可以获取流量数据。 下面是容器资源监控效果图 1、平台里资源监控界面 2、查看容器yangjing-test的cpu使用率资源监控 3、查看内存使用量资源监控 4、查看容器网络流量信息 下面是监控数据收集脚本信息 使用python写的,由于需要往mysql里写入数据,所以需要安装MySQLdb模块以及服务端mysql开启账号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 [root@ip-10-10-29-201code] #catcollect_docker_monitor_data_multi.py #!/usr/bin/envpython #-*-coding:utf-8-*- #author:DengLei #email:dl528888@gmail.com fromdocker import Client import os import socket,struct,fcntl import etcd import MySQLdb import re import multiprocessing import subprocess import time defget_local_ip(iface= 'em1' ): sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sockfd=sock.fileno() SIOCGIFADDR=0x8915 ifreq=struct.pack( '16sH14s' ,iface,socket.AF_INET, '\x00' *14) try: res=fcntl.ioctl(sockfd,SIOCGIFADDR,ifreq) except: return None ip=struct.unpack( '16sH2x4s8x' ,res)[2] return socket.inet_ntoa(ip) defdocker_container_all(): docker_container=docker_client.containers(all=True) container_name=[] container_stop_name=[] for i in docker_container: container_name.append(i[ 'Names' ]) for b in container_name: for c in b: container_stop_name.append(c[1::]) return container_stop_name defdocker_container_run(): docker_container=docker_client.containers(all=True) container_name=[] container_stop_name=[] for i in docker_container: if re.match( 'Up' ,i[ 'Status' ]): container_name.append(i[ 'Names' ]) for b in container_name: for c in b: container_stop_name.append(c[1::]) return container_stop_name defcheck_container_stats(name): container_collect=docker_client.stats(name) old_result= eval (container_collect.next()) new_result= eval (container_collect.next()) container_collect.close() cpu_total_usage=new_result[ 'cpu_stats' ][ 'cpu_usage' ][ 'total_usage' ]-old_result[ 'cpu_stats' ][ 'cpu_usage' ][ 'total_usage' ] cpu_system_uasge=new_result[ 'cpu_stats' ][ 'system_cpu_usage' ]-old_result[ 'cpu_stats' ][ 'system_cpu_usage' ] cpu_num=len(old_result[ 'cpu_stats' ][ 'cpu_usage' ][ 'percpu_usage' ]) cpu_percent=round((float(cpu_total_usage) /float (cpu_system_uasge))*cpu_num*100.0,2) mem_usage=new_result[ 'memory_stats' ][ 'usage' ] mem_limit=new_result[ 'memory_stats' ][ 'limit' ] mem_percent=round(float(mem_usage) /float (mem_limit)*100.0,2) #network_rx_packets=new_result['network']['rx_packets'] #network_tx_packets=new_result['network']['tx_packets'] network_check_command= "" "dockerexec%sifconfigeth1|grepbytes|awk-F':''{print$2,$3}'|awk-F'(''{print$1,$2}'|awk-F')''{print$1}'|awk'{print" {\\ "rx\\" : "$1" ,\\ "tx\\" : "$2" } "}'" "" %name network_old_result= eval (((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip( '\n' )) time . sleep (1) network_new_result= eval (((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip( '\n' )) #unitKB network_rx_packets=(int(network_new_result[ 'rx' ])-int(network_old_result[ 'rx' ])) /1024 network_tx_packets=(int(network_new_result[ 'tx' ])-int(network_old_result[ 'tx' ])) /1024 collect_time=str(new_result[ 'read' ]. split ( '.' )[0]. split ( 'T' )[0])+ '' +str(new_result[ 'read' ]. split ( '.' )[0]. split ( 'T' )[1]) msg={ 'Container_name' :name, 'Cpu_percent' :cpu_percent, 'Memory_usage' :mem_usage, 'Memory_limit' :mem_limit, 'Memory_percent' :mem_percent, 'Network_rx_packets' :network_rx_packets, 'Network_tx_packets' :network_tx_packets, 'Collect_time' :collect_time} #write_mysql(msg) return msg defwrite_mysql(msg): container_name=msg[ 'Container_name' ] search_sql= "selectdc.idfromdocker_containersdc,docker_physicsdpwheredc.container_name='%s'anddp.physics_internal_ip='%s';" %(container_name,local_ip) n=mysql_cur.execute(search_sql) container_id=[int(i[0]) for i in mysql_cur.fetchall()][0] insert_sql= "insertintodocker_monitor(container_id,cpu_percent,memory_usage,memory_limit,memory_percent,network_rx_packets,network_tx_packets,collect_time)values('%s','%s','%s','%s','%s','%s','%s','%s');" %(container_id,msg[ 'Cpu_percent' ],msg[ 'Memory_usage' ],msg[ 'Memory_limit' ],msg[ 'Memory_percent' ],msg[ 'Network_rx_packets' ],msg[ 'Network_tx_packets' ],msg[ 'Collect_time' ]) n=mysql_cur.execute(insert_sql) if __name__== "__main__" : local_ip=get_local_ip( 'ovs1' ) if local_ipisNone: local_ip=get_local_ip( 'em1' ) etcd_client=etcd.Client(host= '127.0.0.1' ,port=4001) docker_client=Client(base_url= 'unix://var/run/docker.sock' ,version= '1.17' ) mysql_conn=MySQLdb.connect(host= '10.10.27.10' ,user= 'ops' , passwd = '1FE@!#@NVE' ,port=3306,charset= "utf8" ) mysql_cur=mysql_conn.cursor() mysql_conn.select_db( 'devops' ) #docker_container_all_name=docker_container_all() docker_container_run_name=docker_container_run() if len(docker_container_run_name)==1: num=1 elif len(docker_container_run_name)>=4andlen(docker_container_run_name)<=8: num=4 elif len(docker_container_run_name)>8andlen(docker_container_run_name)<=15: num=8 elif len(docker_container_run_name)>15andlen(docker_container_run_name)<=30: num=20 else : num=40 pool=multiprocessing.Pool(processes=num) scan_result=[] #collectcontainermonitordata for i in docker_container_run_name: pool.apply_async(check_container_stats,(i,)) scan_result.append(pool.apply_async(check_container_stats,(i,))) pool.close() pool. join () result=[] for res in scan_result: if res.get()isnotNone: write_mysql(res.get()) else : print 'failis%s' %res.get() mysql_conn.commit() mysql_cur.close() mysql_conn.close() 下面是把此脚本放入crontab里每分钟收集一下 1 * /1 ****python /root/collect_docker_monitor_data_multi .py>> /root/docker_log/docker_monitor .log2>&1 另外说明一下,上面的监控数据图形化使用highstock,使用ajax进行动态加载数据,每次获取容器所有时间监控数据。有问题请留言。 本文转自 reinxu 51CTO博客,原文链接:http://blog.51cto.com/dl528888/1635951,如需转载请自行联系原作者

优秀的个人博客,低调大师

android调节音量——AudioManager的应用

Android中可以通过程序获取系统手机的铃声和音量。同样,也可以设置铃声和音量。Android中给出了AudioManager类来实现音量获取、音量控制。 本篇基于 Android API 中的 AudioManager 作讲述,最后给出实例。 下面是本篇大纲: 1、认识 AudioManager 2、AudioManager 主要方法介绍 3、参数解释 1、认识 AudioManager AudioManager 类位于 android.Media 包中,该类提供访问控制音量和钤声模式的操作。 2、AudioManager 主要方法介绍 邮于 AudioManager 该类方法过多,这里只讲述几个比较常用到的方法: 方法:adjustStreamVolume(int streamType, int direction, int flags)streamType为铃声类型,例如:AudioManager.STREAM_VOICE_CALL、AudioManager.STREAM_SYSTEM等,direction当传入的第一个参数为 AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,传入 AudioManager.ADJUST_RAISE 时,则可以将音量调大一个单位。flags为标志位。 方法:getMode() 解释:返回当前音频模式。例如:MODE_NORMAL,MODE_RINGTONE,MODE_IN_CALLorMODE_IN_COMMUNICATION 方法:getRingerMode() 解释:返回当前的铃声模式。例如RINGER_MODE_NORMAL,RINGER_MODE_SILENT, orRINGER_MODE_VIBRATE. 方法:getStreamVolume(int streamType) 解释:取得当前手机的音量,最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”。 方法:setStreamVolume(int streamType, int index, int flags) 解释:改变铃声音量,解释同1,index为声音大小。 方法:setMode(int mode) 解释:改变音频模式。见get方法 方法:setRingerMode(int ringerMode) 解释:改变铃声模式。见get方法 3、参数解释 streamType常用: STREAM_ALARM警报 STREAM_MUSIC音乐回放即媒体音量 STREAM_NOTIFICATION窗口顶部状态栏Notification, STREAM_RING铃声 STREAM_SYSTEM系统 STREAM_VOICE_CALL通话 STREAM_DTMF双音多频,拨号键的声音 direction,是调整的方向,增加或减少,可以是: ADJUST_LOWER降低音量 ADJUST_RAISE升高音量 ADJUST_SAME保持不变,这个主要用于向用户展示当前的音量 flags,是附加参数: FLAG_PLAY_SOUND调整音量时播放声音 FLAG_SHOW_UI调整时显示音量条,就是按音量键出现的界面 FLAG_REMOVE_SOUND_AND_VIBRATE无振动无声音 FLAG_ALLOW_RINGER_MODESWhether to include ringer modes as possible options when changing volume. FLAG_VIBRATEWhether to vibrate if going into the vibrate ringer mode *********************************************************************** *转载务必在明显处注明:http://blog.csdn.net/xyz_lmn * * 作者:张兴业 * * 邮箱:xy-zhang@163.com * *********************************************************************** 参考: http://developer.android.com/reference/android/media/AudioManager.html 实例: http://code.google.com/p/app-soundmanager http://mobile.51cto.com/android-309353.htm 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230783 ,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册