Android 分享一个流量显示界面

Android系统远程shell命令控制以及白名单 如何在Android系统使用java代码执行shell命令 在java中我们是并不能直接运行shell命令的,我们需要用到Runtime这个类来执行shell命令,Runtime的介绍呢,我说不好更说不清,这里便不误人子弟了,但是有一点强调,Runtime类是恶汉单例模式,在jvm创建时便已创建对象,并且构造方法也为私有构造,所以我们想要拿到Runtime类的对象需要通过Runtime.getRu... 阅读详情
  波形效果有几种不同的呈现形式,比如从中间向四周散开的波形,也就是熟知的水涟漪;还有上下波动的曲线,像五线谱等。英文中可以称作Wave或者Ripple,所以暂且叫它们WaveView、WaveLayout、RippleView、RippleLayout,接下来开始实现这些效果。
  首先看一下Solo 火爆足球动态壁纸,

  下面中间的按钮就是一个波形按钮,它会不断地向四周辐射,由于是静态图,如果想体验真实效果可以另行下载。这种效果的实现思路是不断绘制圆形,当然半径也要不断变化,透明度也是一样。代码如下:
[html]  view plain copy
  1. /**  
  2. *  
  3. */  
  4. package com.kince.rippleview;  
  5.   
  6. import android.content.Context;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.BitmapFactory;  
  9. import android.graphics.Canvas;  
  10. import android.graphics.Color;  
  11. import android.graphics.Paint;  
  12. import android.graphics.RectF;  
  13. import android.os.Handler;  
  14. import android.os.Message;  
  15. import android.util.AttributeSet;  
  16. import android.view.View;  
  17.   
  18. /**  
  19. * @author kince  
  20. * @category 波纹  
  21. * @since 2014.8.9  
  22. * @version v1.0.0  
  23. *  
  24. */  
  25. public class RippleView extends View {  
  26.   
  27.      private int mScreenWidth;  
  28.      private int mScreenHeight;  
  29.   
  30.      private Bitmap mRippleBitmap;  
  31.      private Paint mRipplePaint = new Paint();  
  32.   
  33.      private int mBitmapWidth;  
  34.      private int mBitmapHeight;  
  35.   
  36.      private boolean isStartRipple;  
  37.   
  38.      private int heightPaddingTop;  
  39.      private int heightPaddingBottom;  
  40.      private int widthPaddingLeft;  
  41.      private int widthPaddingRight;  
  42.   
  43.      private RectF mRect = new RectF();  
  44.   
  45.      private int rippleFirstRadius = 0;  
  46.      private int rippleSecendRadius = -33;  
  47.      private int rippleThirdRadius = -66;  
  48.   
  49.      private Paint textPaint = new Paint();  
  50.     private String mText="点击我吧";  
  51.      
  52.      private Handler handler = new Handler() {  
  53.           @Override  
  54.           public void handleMessage(Message msg) {  
  55.                // TODO Auto-generated method stub  
  56.                super.handleMessage(msg);  
  57.                invalidate();  
  58.                if (isStartRipple) {  
  59.                     rippleFirstRadius++;  
  60.                     if (rippleFirstRadius > 100) {  
  61.                          rippleFirstRadius = 0;  
  62.                     }  
  63.                     rippleSecendRadius++;  
  64.                     if (rippleSecendRadius > 100) {  
  65.                          rippleSecendRadius = 0;  
  66.                     }  
  67.                     rippleThirdRadius++;  
  68.                     if (rippleThirdRadius > 100) {  
  69.                          rippleThirdRadius = 0;  
  70.                     }  
  71.                     sendEmptyMessageDelayed(0, 20);  
  72.                }  
  73.           }  
  74.      };  
  75.   
  76.      /**  
  77.      * @param context  
  78.      */  
  79.      public RippleView(Context context) {  
  80.           super(context);  
  81.           // TODO Auto-generated constructor stub  
  82.           init();  
  83.      }  
  84.   
  85.      /**  
  86.      * @param context  
  87.      * @param attrs  
  88.      */  
  89.      public RippleView(Context context, AttributeSet attrs) {  
  90.           super(context, attrs);  
  91.           // TODO Auto-generated constructor stub  
  92.           init();  
  93.      }  
  94.   
  95.      /**  
  96.      * @param context  
  97.      * @param attrs  
  98.      * @param defStyleAttr  
  99.      */  
  100.      public RippleView(Context context, AttributeSet attrs, int defStyleAttr) {  
  101.           super(context, attrs, defStyleAttr);  
  102.           // TODO Auto-generated constructor stub  
  103.           init();  
  104.      }  
  105.   
  106.      private void init() {  
  107.           mRipplePaint.setColor(4961729);  
  108.           mRipplePaint.setAntiAlias(true);  
  109.           mRipplePaint.setStyle(Paint.Style.FILL);  
  110.   
  111.           textPaint.setTextSize(26);  
  112.           textPaint.setAntiAlias(true);  
  113.           textPaint.setStyle(Paint.Style.FILL);  
  114.           textPaint.setColor(Color.WHITE);  
  115.   
  116.           mRippleBitmap = BitmapFactory.decodeStream(getResources()  
  117.                     .openRawResource(R.drawable.easy3d_ic_apply));  
  118.           mBitmapWidth = mRippleBitmap.getWidth();  
  119.           mBitmapHeight = mRippleBitmap.getHeight();  
  120.      }  
  121.   
  122.      @Override  
  123.      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  124.           // TODO Auto-generated method stub  
  125.           super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  126.           int mh = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();  
  127.           int mw = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();  
  128.           if (mBitmapWidth < 2 * mBitmapHeight) {  
  129.                mBitmapWidth = (2 * mBitmapHeight);  
  130.           }  
  131.           setMeasuredDimension(mBitmapWidth, mBitmapHeight);  
  132.      }  
  133.   
  134.      @Override  
  135.      protected void onDraw(Canvas canvas) {  
  136.           // TODO Auto-generated method stub  
  137.           super.onDraw(canvas);  
  138.           if (isStartRipple) {  
  139.                float f1 = 3 * mBitmapHeight / 10;  
  140.                mRipplePaint.setAlpha(255);  
  141.                canvas.drawCircle(mBitmapWidth / 2, mBitmapHeight,  
  142.                          7 * mBitmapHeight / 10, mRipplePaint);  
  143.                int i1 = (int) (220.0F - (220.0F - 0.0F) / 100.0F  
  144.                          * rippleFirstRadius);  
  145.                mRipplePaint.setAlpha(i1);  
  146.                canvas.drawCircle(mBitmapWidth / 2, mBitmapHeight, 7  
  147.                          * mBitmapHeight / 10 + f1 * rippleFirstRadius / 100.0F,  
  148.                          mRipplePaint);  
  149.                if (rippleSecendRadius >= 0) {  
  150.                     int i3 = (int) (220.0F - (220.0F - 0.0F) / 100.0F  
  151.                               * rippleSecendRadius);  
  152.                     mRipplePaint.setAlpha(i3);  
  153.                     canvas.drawCircle(mBitmapWidth / 2, mBitmapHeight,  
  154.                               7 * mBitmapHeight / 10 + f1 * rippleSecendRadius  
  155.                                         / 100.0F, mRipplePaint);  
  156.                }  
  157.                if (rippleThirdRadius >= 0) {  
  158.                     int i2 = (int) (220.0F - (220.0F - 0.0F) / 100.0F  
  159.                               * rippleThirdRadius);  
  160.                     mRipplePaint.setAlpha(i2);  
  161.                     canvas.drawCircle(mBitmapWidth / 2, mBitmapHeight, 7  
  162.                               * mBitmapHeight / 10 + f1 * rippleThirdRadius / 100.0F,  
  163.                               mRipplePaint);  
  164.                }  
  165.   
  166.           }  
  167.           mRipplePaint.setAlpha(30);  
  168.           canvas.drawCircle(mBitmapWidth / 2, mBitmapHeight, mBitmapHeight,  
  169.                     mRipplePaint);  
  170.           mRipplePaint.setAlpha(120);  
  171.           canvas.drawCircle(mBitmapWidth / 2, mBitmapHeight,  
  172.                     9 * mBitmapHeight / 10, mRipplePaint);  
  173.           mRipplePaint.setAlpha(180);  
  174.           canvas.drawCircle(mBitmapWidth / 2, mBitmapHeight,  
  175.                     8 * mBitmapHeight / 10, mRipplePaint);  
  176.           mRipplePaint.setAlpha(255);  
  177.           canvas.drawCircle(mBitmapWidth / 2, mBitmapHeight,  
  178.                     7 * mBitmapHeight / 10, mRipplePaint);  
  179.           float length = textPaint.measureText(mText);  
  180.           canvas.drawText(mText, (mBitmapWidth - length) / 2,  
  181.                     mBitmapHeight * 3 / 4, textPaint);  
  182.   
  183.      }  
  184.   
  185.      @Override  
  186.      protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  187.           // TODO Auto-generated method stub  
  188.           super.onSizeChanged(w, h, oldw, oldh);  
  189.           mScreenWidth = w;  
  190.           mScreenHeight = h;  
  191.           confirmSize();  
  192.           invalidate();  
  193.   
  194.      }  
  195.   
  196.      private void confirmSize() {  
  197.           int minScreenSize = Math.min(mScreenWidth, mScreenHeight);  
  198.           int widthOverSize = mScreenWidth - minScreenSize;  
  199.           int heightOverSize = mScreenHeight - minScreenSize;  
  200.           heightPaddingTop = (getPaddingTop() + heightOverSize / 2);  
  201.           heightPaddingBottom = (getPaddingBottom() + heightOverSize / 2);  
  202.           widthPaddingLeft = (getPaddingLeft() + widthOverSize / 2);  
  203.           widthPaddingRight = (getPaddingRight() + widthOverSize / 2);  
  204.   
  205.           int width = getWidth();  
  206.           int height = getHeight();  
  207.   
  208.           mRect = new RectF(widthPaddingLeft, heightPaddingTop, width  
  209.                     - widthPaddingRight, height * 2 - heightPaddingBottom);  
  210.   
  211.      }  
  212.   
  213.      public void stratRipple() {  
  214.           isStartRipple = true;  
  215.           handler.sendEmptyMessage(0);  
  216.      }  
  217.   
  218. }  
  下图是某个应用的流量显示界面,使用的是上面说的第二种形式。
  实现上面效果的思路是使用正弦或者余弦曲线,代码如下:
[html]  view plain copy
  1. /**  
  2. *  
  3. */  
  4. package com.kince.waveview;  
  5.   
  6. import android.content.Context;  
  7. import android.graphics.Canvas;  
  8. import android.graphics.Color;  
  9. import android.graphics.Paint;  
  10. import android.graphics.Path;  
  11. import android.graphics.RectF;  
  12. import android.os.Handler;  
  13. import android.os.Parcel;  
  14. import android.os.Parcelable;  
  15. import android.util.AttributeSet;  
  16. import android.view.View;  
  17. import android.widget.ProgressBar;  
  18.   
  19. /**  
  20. * @author kince  
  21. * @category View必须是正方形  
  22. *  
  23. */  
  24. public class WaterWaveView extends View {  
  25.   
  26.      private Context mContext;  
  27.   
  28.      private int mScreenWidth;  
  29.      private int mScreenHeight;  
  30.   
  31.      private Paint mRingPaint;  
  32.      private Paint mCirclePaint;  
  33.      private Paint mWavePaint;  
  34.      private Paint linePaint;  
  35.      private Paint flowPaint;  
  36.      private Paint leftPaint;  
  37.   
  38.      private int mRingSTROKEWidth = 15;  
  39.      private int mCircleSTROKEWidth = 2;  
  40.      private int mLineSTROKEWidth = 1;  
  41.   
  42.      private int mCircleColor = Color.WHITE;  
  43.      private int mRingColor = Color.WHITE;  
  44.      private int mWaveColor = Color.WHITE;  
  45.   
  46.      private Handler mHandler;  
  47.      private long c = 0L;  
  48.      private boolean mStarted = false;  
  49.      private final float f = 0.033F;  
  50.      private int mAlpha = 50;// 透明度  
  51.      private float mAmplitude = 10.0F; // 振幅  
  52.      private float mWateLevel = 0.5F;// 水高(0~1)  
  53.      private Path mPath;  
  54.   
  55.      private String flowNum = "1024M";  
  56.      private String flowLeft = "还剩余";  
  57.   
  58.      /**  
  59.      * @param context  
  60.      */  
  61.      public WaterWaveView(Context context) {  
  62.           super(context);  
  63.           // TODO Auto-generated constructor stub  
  64.           mContext = context;  
  65.           init(mContext);  
  66.      }  
  67.   
  68.      /**  
  69.      * @param context  
  70.      * @param attrs  
  71.      */  
  72.      public WaterWaveView(Context context, AttributeSet attrs) {  
  73.           super(context, attrs);  
  74.           // TODO Auto-generated constructor stub  
  75.           mContext = context;  
  76.           init(mContext);  
  77.      }  
  78.   
  79.      /**  
  80.      * @param context  
  81.      * @param attrs  
  82.      * @param defStyleAttr  
  83.      */  
  84.      public WaterWaveView(Context context, AttributeSet attrs, int defStyleAttr) {  
  85.           super(context, attrs, defStyleAttr);  
  86.           // TODO Auto-generated constructor stub  
  87.           mContext = context;  
  88.           init(mContext);  
  89.      }  
  90.   
  91.      private void init(Context context) {  
  92.           mRingPaint = new Paint();  
  93.           mRingPaint.setColor(mRingColor);  
  94.           mRingPaint.setAlpha(50);  
  95.           mRingPaint.setStyle(Paint.Style.STROKE);  
  96.           mRingPaint.setAntiAlias(true);  
  97.           mRingPaint.setStrokeWidth(mRingSTROKEWidth);  
  98.   
  99.           mCirclePaint = new Paint();  
  100.           mCirclePaint.setColor(mCircleColor);  
  101.           mCirclePaint.setStyle(Paint.Style.STROKE);  
  102.           mCirclePaint.setAntiAlias(true);  
  103.           mCirclePaint.setStrokeWidth(mCircleSTROKEWidth);  
  104.   
  105.           linePaint = new Paint();  
  106.           linePaint.setColor(mCircleColor);  
  107.           linePaint.setStyle(Paint.Style.STROKE);  
  108.           linePaint.setAntiAlias(true);  
  109.           linePaint.setStrokeWidth(mLineSTROKEWidth);  
  110.   
  111.           flowPaint = new Paint();  
  112.           flowPaint.setColor(mCircleColor);  
  113.           flowPaint.setStyle(Paint.Style.FILL);  
  114.           flowPaint.setAntiAlias(true);  
  115.           flowPaint.setTextSize(36);  
  116.   
  117.           leftPaint = new Paint();  
  118.           leftPaint.setColor(mCircleColor);  
  119.           leftPaint.setStyle(Paint.Style.FILL);  
  120.           leftPaint.setAntiAlias(true);  
  121.           leftPaint.setTextSize(18);  
  122.   
  123.           mWavePaint = new Paint();  
  124.           mWavePaint.setStrokeWidth(1.0F);  
  125.           mWavePaint.setColor(mWaveColor);  
  126.           mWavePaint.setAlpha(mAlpha);  
  127.           mPath = new Path();  
  128.   
  129.           mHandler = new Handler() {  
  130.                @Override  
  131.                public void handleMessage(android.os.Message msg) {  
  132.                     if (msg.what == 0) {  
  133.                          invalidate();  
  134.                          if (mStarted) {  
  135.                               // 不断发消息给自己,使自己不断被重绘  
  136.                               mHandler.sendEmptyMessageDelayed(0, 60L);  
  137.                          }  
  138.                     }  
  139.                }  
  140.           };  
  141.      }  
  142.   
  143.      @Override  
  144.      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  145.           int width = measure(widthMeasureSpec, true);  
  146.           int height = measure(heightMeasureSpec, false);  
  147.           if (width < height) {  
  148.                setMeasuredDimension(width, width);  
  149.           } else {  
  150.                setMeasuredDimension(height, height);  
  151.           }  
  152.   
  153.      }  
  154.   
  155.      /**  
  156.      * @category 测量  
  157.      * @param measureSpec  
  158.      * @param isWidth  
  159.      * @return  
  160.      */  
  161.      private int measure(int measureSpec, boolean isWidth) {  
  162.           int result;  
  163.           int mode = MeasureSpec.getMode(measureSpec);  
  164.           int size = MeasureSpec.getSize(measureSpec);  
  165.           int padding = isWidth ? getPaddingLeft() + getPaddingRight()  
  166.                     : getPaddingTop() + getPaddingBottom();  
  167.           if (mode == MeasureSpec.EXACTLY) {  
  168.                result = size;  
  169.           } else {  
  170.                result = isWidth ? getSuggestedMinimumWidth()  
  171.                          : getSuggestedMinimumHeight();  
  172.                result += padding;  
  173.                if (mode == MeasureSpec.AT_MOST) {  
  174.                     if (isWidth) {  
  175.                          result = Math.max(result, size);  
  176.                     } else {  
  177.                          result = Math.min(result, size);  
  178.                     }  
  179.                }  
  180.           }  
  181.           return result;  
  182.      }  
  183.   
  184.      @Override  
  185.      protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  186.           // TODO Auto-generated method stub  
  187.           super.onSizeChanged(w, h, oldw, oldh);  
  188.           mScreenWidth = w;  
  189.           mScreenHeight = h;  
  190.      }  
  191.   
  192.      @Override  
  193.      protected void onDraw(Canvas canvas) {  
  194.           // TODO Auto-generated method stub  
  195.           super.onDraw(canvas);  
  196.           // 得到控件的宽高  
  197.           int width = getWidth();  
  198.           int height = getHeight();  
  199.           setBackgroundColor(mContext.getResources().getColor(  
  200.                     R.color.holo_purple2));  
  201.   
  202.           canvas.drawCircle(mScreenWidth / 2, mScreenHeight / 2,  
  203.                     mScreenWidth / 4, mRingPaint);  
  204.   
  205.           canvas.drawCircle(mScreenWidth / 2, mScreenHeight / 2, mScreenWidth / 4  
  206.                     - mRingSTROKEWidth / 2, mCirclePaint);  
  207.           canvas.drawLine(mScreenWidth * 3 / 8, mScreenHeight * 5 / 8,  
  208.                     mScreenWidth * 5 / 8, mScreenHeight * 5 / 8, linePaint);  
  209.           float num = flowPaint.measureText(flowNum);  
  210.           canvas.drawText(flowNum, mScreenWidth * 4 / 8 - num / 2,  
  211.                     mScreenHeight * 4 / 8, flowPaint);  
  212.           float left = leftPaint.measureText(flowLeft);  
  213.           canvas.drawText(flowLeft, mScreenWidth * 4 / 8 - left / 2,  
  214.                     mScreenHeight * 3 / 8, leftPaint);  
  215.   
  216.           // 如果未开始(未调用startWave方法),绘制一个扇形  
  217.           if ((!mStarted) || (mScreenWidth == 0) || (mScreenHeight == 0)) {  
  218.                RectF oval = new RectF(mScreenWidth / 4 + mRingSTROKEWidth / 2,  
  219.                          mScreenHeight / 4 + mRingSTROKEWidth / 2, mScreenWidth * 3  
  220.                                    / 4 - mRingSTROKEWidth / 2, mScreenHeight * 3 / 4  
  221.                                    - mRingSTROKEWidth / 2);// 设置个新的长方形,扫描测量  
  222.                canvas.drawArc(oval, 0, 180, true, mWavePaint);  
  223.                return;  
  224.           }  
  225.           // 绘制,即水面静止时的高度  
  226.           RectF oval = new RectF(mScreenWidth / 4 + mRingSTROKEWidth / 2,  
  227.                     mScreenHeight / 4 + mRingSTROKEWidth / 2 + mAmplitude * 2,  
  228.                     mScreenWidth * 3 / 4 - mRingSTROKEWidth / 2, mScreenHeight * 3  
  229.                               / 4 - mRingSTROKEWidth / 2);// 设置个新的长方形,扫描测量  
  230.           canvas.drawArc(oval, 0, 180, true, mWavePaint);  
  231.   
  232.           if (this.c >= 8388607L) {  
  233.                this.c = 0L;  
  234.           }  
  235.           // 每次onDraw时c都会自增  
  236.           c = (1L + c);  
  237.           float f1 = mScreenHeight * (1.0F - mWateLevel);  
  238.           int top = (int) (f1 + mAmplitude);  
  239.           mPath.reset();  
  240.           int startX = mScreenWidth / 2 - mScreenWidth / 4 + mRingSTROKEWidth / 2;  
  241.           // 波浪效果  
  242.           while (startX < mScreenWidth / 2 + mScreenWidth / 4 - mRingSTROKEWidth  
  243.                     / 2) {  
  244.                int startY = (int) (f1 - mAmplitude  
  245.                          * Math.sin(Math.PI  
  246.                                    * (2.0F * (startX + this.c * width * this.f))  
  247.                                    / width));  
  248.                canvas.drawLine(startX, startY, startX, top, mWavePaint);  
  249.                startX++;  
  250.           }  
  251.           canvas.restore();  
  252.      }  
  253.   
  254.      @Override  
  255.      public Parcelable onSaveInstanceState() {  
  256.           // Force our ancestor class to save its state  
  257.           Parcelable superState = super.onSaveInstanceState();  
  258.           SavedState ss = new SavedState(superState);  
  259.           ss.progress = (int) c;  
  260.           return ss;  
  261.      }  
  262.   
  263.      @Override  
  264.      public void onRestoreInstanceState(Parcelable state) {  
  265.           SavedState ss = (SavedState) state;  
  266.           super.onRestoreInstanceState(ss.getSuperState());  
  267.           c = ss.progress;  
  268.      }  
  269.   
  270.      @Override  
  271.      protected void onAttachedToWindow() {  
  272.           super.onAttachedToWindow();  
  273.           // 关闭硬件加速,防止异常unsupported operation exception  
  274.           this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
  275.      }  
  276.   
  277.      @Override  
  278.      protected void onDetachedFromWindow() {  
  279.           super.onDetachedFromWindow();  
  280.      }  
  281.   
  282.      /**  
  283.      * @category 开始波动  
  284.      */  
  285.      public void startWave() {  
  286.           if (!mStarted) {  
  287.                this.c = 0L;  
  288.                mStarted = true;  
  289.                this.mHandler.sendEmptyMessage(0);  
  290.           }  
  291.      }  
  292.   
  293.      /**  
  294.      * @category 停止波动  
  295.      */  
  296.      public void stopWave() {  
  297.           if (mStarted) {  
  298.                this.c = 0L;  
  299.                mStarted = false;  
  300.                this.mHandler.removeMessages(0);  
  301.           }  
  302.      }  
  303.   
  304.      /**  
  305.      * @category 保存状态  
  306.      */  
  307.      static class SavedState extends BaseSavedState {  
  308.           int progress;  
  309.   
  310.           /**  
  311.           * Constructor called from {@link ProgressBar#onSaveInstanceState()}  
  312.           */  
  313.           SavedState(Parcelable superState) {  
  314.                super(superState);  
  315.           }  
  316.   
  317.           /**  
  318.           * Constructor called from {@link #CREATOR}  
  319.           */  
  320.           private SavedState(Parcel in) {  
  321.                super(in);  
  322.                progress = in.readInt();  
  323.           }  
  324.   
  325.           @Override  
  326.           public void writeToParcel(Parcel out, int flags) {  
  327.                super.writeToParcel(out, flags);  
  328.                out.writeInt(progress);  
  329.           }  
  330.   
  331.           public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {  
  332.                public SavedState createFromParcel(Parcel in) {  
  333.                     return new SavedState(in);  
  334.                }  
  335.   
  336.                public SavedState[] newArray(int size) {  
  337.                     return new SavedState[size];  
  338.                }  
  339.           };  
  340.      }  
  341.   
  342. }  
关于#wireshark#的问题:需要安卓app流量数据集要安卓流量做包序列长度的实验 ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏「Bug调优」,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个,您的支持就是我坚持写作分享知识点传播技术的最大动力。「猿圈奇妙屋」;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有。 阅读详情

相关推荐

android实例之 流量监控悬浮窗 实时网速的获取

网上那个有bug,这个是我修改的。喜欢的可以下

Android/Linux系统性能分析及工具

CPU CPU架构 CPU推动了所有软件的运行,因此通常是系统性能分析的首要目标。现代系统一般有多颗CPU,通过内核调度器共享给所有运行软件。当需求的CPU资源超过了系统力所能及的范围时,进程里的线程(或者任务)将会排队,等待轮候自己运行的机会。等待给应用程序的运行带来严重延时,使得性能下降。 我们可以通过仔细检查CPU的用量,寻找性能改进的空间,还可以去除一些不需要的负载。 CPU内存缓存 为了提高内存I/O性能,处理器提供了多种硬件缓存。缓存大小的关系如下图,越小则速度越快...

静虚待令,有物混成 2507

Android获取指定应用,单独应用的流量统计

Android获取指定应用,单独应用的流量统计

Android开发笔记(六十)网络的检测与连接

检测网络 APP在访问网络之前,正常都要先检测网络状态,因为如果未连接网络就上网的话,常常导致超时等待。另外,APP有时也需区分当前网络是wifi环境还是数据连接环境,如果是数据连接环境,那么为了节省流量,一般不进行下载操作也不加载大图片;如果是wifi环境,那就都可以做而不必担心消耗流量。 ConnectivityManager就是用于检测网络连接的工具类,其对象从系统服务Conte

aqi00的博客 6027

[Android]具有悬浮窗口的网路流量监控分析器(源码)

基于Android设备的网路流量监控分析器实作 资源内容为ANDROID应用程序工程源代码 实现流量统计,并实作了悬浮窗口以显示即时网路流量 详细内容请至下方网址优快云博客浏览 http://blog.youkuaiyun.com/yehjordan/article/details/18816575

手把手搭建你的第一个OCT仿真模型:用Python和光学仿真库重现A-SCAN信号

本文详细介绍了如何使用Python和光学仿真库搭建OCT仿真模型,重现A-SCAN信号。从环境配置、干涉仪建模到信号处理全流程,手把手教你实现光学相干层析成像的核心技术。通过代码示例和性能优化技巧,帮助开发者深入理解OCT原理并应用于医疗诊断等领域。

weixin_42562079的博客 240

Android调试命令总结

am命令 我们知道android底层是linux 是用c写的 应用层是用java写的apk程序 那么系统实现系统底层和应用层是如何通信的呢,比如系统要调用一个计算器程序? 那便是用的命令行工具am 底层应该是用localsocket通信 我们可以通过命令启动android中的Activity,Service,BroadcastReceiver 等组件 ...

weixin_33937499的博客 587

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1090

Linux流量监控工具 – iftop (最全面的iftop教程)

在类Unix系统中可以使用top查看系统资源、进程、内存占用等信息。查看网络状态可以使用netstat、nmap等工具。若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop。 一、iftop是什么? iftop是类似于top的实时流量监控工具。 官方网站:http://www.ex-parrot.com/~pdw/iftop/ 二、iftop有什么用? iftop可以用来监控网卡的...

入海数沙 2311

3分钟搞懂欧式距离变换(EDT):从暴力算法到Felzenszwalb的演进史

本文系统梳理了欧式距离变换(EDT)从暴力算法到高效线性算法的演进历程。重点解析了光栅扫描算法和Felzenszwalb算法的核心思想与实现,并探讨了其在机器人路径规划中生成欧几里得符号距离场(ESDF)的关键应用,为开发者提供了清晰的算法选型与实战指南。

fern8的博客 976

告别Link180!在Ansys Mechanical 2020R2中正确启用Cable280绳索单元(附Beta选项开启指南)

本文详细介绍了在Ansys Mechanical 2020R2中启用Cable280绳索单元的全过程,包括Beta选项的开启步骤、建模技巧及高阶应用。Cable280作为专为绳索仿真设计的单元,相比传统的Link180单元,在大变形模拟和计算效率上表现更优,特别适合斜拉桥、电梯牵引绳等工程场景。

weixin_33711647的博客 405

安卓Android虚拟机分享及下载链接

Android虚拟机,LineageOS 是一个基于 Android 的开源操作系统,旨在为各种设备提供更灵活和可定制的用户体验。它是 CyanogenMod 项目的继承者,旨在保持高质量的代码和社区驱动的发展。

秃桔子的博客 3712

RTC 实时时钟实验

如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) // 往备份区域写用户数据的函数 (这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的)存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。寄存器操作完成,并同步之后,设置秒钟中断。

m0_55996456的博客 1205

安卓Android虚拟机分享及使用

不知道大家伙在安装安卓虚拟机时被各式各样的问题折磨过没,我在安装安卓虚拟机时,遇到的问题简直就像长江之水源源不断,就算是最后安装好了也会因为各式各样的原因无法进入启动桌面。 当我发现这个可以直接导入到电脑一键开启运行的虚拟机时,今天我必须分享给大家!话不多说安排! 这个可以直接导入到vmware或者virtualbox中进行使用,这里的虚拟机文件通常来源于国外网站,例如osbox,各大linu...

秃桔子的博客 2208

华为流程L1-L6业务流程深度细化到可执行【附全文阅读】

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。

cdfunlove的博客 4003

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

学无止境、积少成多、厚积薄发 3984

android后台流量限制,手机流量控制!安卓手机控制流量设置小技巧

原标题:手机流量控制!安卓手机控制流量设置小技巧手机流量控制!安卓手机控制流量设置小技巧?随着4G网络时代的开启,手机每月耗流量不再是以M为单位,二手以G为单位。曾经的2G时代,一个月只需要20、30M就可以解决,而如今1G、2G根本就档不住。那么安卓手机应该如何省流量? 对于安卓手机用户而言,Android系统的碎片化太过严重了,除了不同版本的Android系统以外,用户还要适应不同手机厂商定制...

weixin_39899691的博客 4364

ISO2626 --- Item Definition相关项定义

本文并不是针对ISO26262的一个项目,而是针对ISO26262的规范,我们在相关项定义阶段,我们需要做什么,我们的文档需要包含哪些内容的一个描述。

wj博客 909

如何建立一个最简单的安卓项目

如何建立一个最简单的安卓项目 第一次玩安卓的盆友可以参考一下,如何创建一个基础的安卓项目,应该算是挺容易的。 那么就让我们开始吧 首先呢,你得先下载一个AndroidStudio软件,链接: [link]https://developer.android.google.cn/studio/,先说一下七百多兆呢,用流量的可得注意了。具体如何安装就先不说明了,有问题的自行度娘或者写在评论区,这次主要来...

weixin_42907702的博客 1914

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android系统手机流量控制方法,手机流量控制!安卓手机控制流量设置小技巧

原标题:手机流量控制!安卓手机控制流量设置小技巧手机流量控制!安卓手机控制流量设置小技巧?随着4G网络时代的开启,手机每月耗流量不再是以M为单位,二手以G为单位。曾经的2G时代,一个月只需要20、30M就可以解决,而如今1G、2G根本就档不住。那么安卓手机应该如何省流量? 对于安卓手机用户而言,Android系统的碎片化太过严重了,除了不同版本的Android系统以外,用户还要适应不同手机厂商定制...

weixin_34897842的博客 1657

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 分享给好友,如何将安卓手机安装的APP分享给好友简单方法分享

我们手机中往往都安装了大量好用的APP,如果你想将某一款APP分享给好友,最常见的方法就是告诉对方应用名称或下载链接,又或是两款手机安装相同的手机搬家类软件实现APP的分享。那么,有没有不浪费对方流量,可以直接将APP安装文件分享的方法呢?想实现上述目的,推荐大家尝试“SendApp”这款应用来操作(下载地址请自行搜索)。打开“SendApp”这款应用以后,可以在应用列表中看到已经安装的所有应用。...

weixin_29432863的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: Android去掉标题栏和全屏都是件很容易的事情
下一篇: Android基础之使用Fragment控制切换多个页面
小人物2014
博客等级 码龄19年 66粉丝 99原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值