程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中HttpWebRequest的用法詳解

C#中HttpWebRequest的用法詳解

編輯:C#入門知識

C#中HttpWebRequest的用法詳解。本站提示廣大學習愛好者:(C#中HttpWebRequest的用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中HttpWebRequest的用法詳解正文


1、概述
比來須要用進度條,秉著不反復造輪子的准繩,上github上搜刮了一番,看了幾個認為比擬悅目的ProgressBar,好比:daimajia的等。簡略看了下代碼,根本都是繼續自View,徹完全底的自界說了一個進度條。盯著那壯麗轉動條,溘然認為,為何要經由過程View去寫一個轉動條,體系曾經供給了ProgressBar和屬於它的特征,我們沒需要從新去構建一個,然則體系的又比擬丑,分歧版本變現還紛歧定一樣。那末得出我們的目的:轉變體系ProgressBar的模樣。
對沒錯,我們沒有需要去從0打造一個ProgressBar,人家固然長的欠好看,然則特征和穩固性照樣方才的,我們只須要為其整下容就ok了。
接上去,我們貼下後果圖:
1、橫向的進度條

2、圓形的進度條

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072809374391.jpg (414×620)

沒錯,這就是我們的進度條後果,橫向的模擬了daimajia的進度條模樣。不外我們繼續子ProgressBar,簡略的為其全部容,代碼清楚易懂 。為何說,易懂呢?
橫向誰人進度條,年夜家會drawLine()和drawText()吧,那末經由過程getWidth()拿到控件的寬度,再經由過程getProgress()拿到進度,按比例掌握繪制線的長短,字的地位還不是分分鐘的事。

2、完成
 橫向的轉動條繪制確定須要一些屬性,好比已/未達到進度的色彩、寬度,文本的色彩、年夜小等。
 原來呢,我是想經由過程體系ProgressBar的progressDrawable,從外面提取一些屬性完成繪制須要的參數的。然則,終究呢,反而讓代碼變得龐雜。所以終究照樣改用自界說屬性。 說道自界說屬性,年夜家應當曾經不生疏了。
1、HorizontalProgressBarWithNumber
(1)自界說屬性
values/attr_progress_bar.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
 
  <declare-styleable name="HorizontalProgressBarWithNumber"> 
    <attr name="progress_unreached_color" format="color" /> 
    <attr name="progress_reached_color" format="color" /> 
    <attr name="progress_reached_bar_height" format="dimension" /> 
    <attr name="progress_unreached_bar_height" format="dimension" /> 
    <attr name="progress_text_size" format="dimension" /> 
    <attr name="progress_text_color" format="color" /> 
    <attr name="progress_text_offset" format="dimension" /> 
    <attr name="progress_text_visibility" format="enum"> 
      <enum name="visible" value="0" /> 
      <enum name="invisible" value="1" /> 
    </attr> 
  </declare-styleable> 
   
  <declare-styleable name="RoundProgressBarWidthNumber"> 
    <attr name="radius" format="dimension" /> 
  </declare-styleable> 
 
</resources> 

(2)結構中獲得

public class HorizontalProgressBarWithNumber extends ProgressBar 
{ 
 
  private static final int DEFAULT_TEXT_SIZE = 10; 
  private static final int DEFAULT_TEXT_COLOR = 0XFFFC00D1; 
  private static final int DEFAULT_COLOR_UNREACHED_COLOR = 0xFFd3d6da; 
  private static final int DEFAULT_HEIGHT_REACHED_PROGRESS_BAR = 2; 
  private static final int DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR = 2; 
  private static final int DEFAULT_SIZE_TEXT_OFFSET = 10; 
 
  /** 
   * painter of all drawing things 
   */ 
  protected Paint mPaint = new Paint(); 
  /** 
   * color of progress number 
   */ 
  protected int mTextColor = DEFAULT_TEXT_COLOR; 
  /** 
   * size of text (sp) 
   */ 
  protected int mTextSize = sp2px(DEFAULT_TEXT_SIZE); 
 
  /** 
   * offset of draw progress 
   */ 
  protected int mTextOffset = dp2px(DEFAULT_SIZE_TEXT_OFFSET); 
 
  /** 
   * height of reached progress bar 
   */ 
  protected int mReachedProgressBarHeight = dp2px(DEFAULT_HEIGHT_REACHED_PROGRESS_BAR); 
 
  /** 
   * color of reached bar 
   */ 
  protected int mReachedBarColor = DEFAULT_TEXT_COLOR; 
  /** 
   * color of unreached bar 
   */ 
  protected int mUnReachedBarColor = DEFAULT_COLOR_UNREACHED_COLOR; 
  /** 
   * height of unreached progress bar 
   */ 
  protected int mUnReachedProgressBarHeight = dp2px(DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR); 
  /** 
   * view width except padding 
   */ 
  protected int mRealWidth; 
   
  protected boolean mIfDrawText = true; 
 
  protected static final int VISIBLE = 0; 
 
  public HorizontalProgressBarWithNumber(Context context, AttributeSet attrs) 
  { 
    this(context, attrs, 0); 
  } 
 
  public HorizontalProgressBarWithNumber(Context context, AttributeSet attrs, 
      int defStyle) 
  { 
    super(context, attrs, defStyle); 
     
    setHorizontalScrollBarEnabled(true); 
 
    obtainStyledAttributes(attrs); 
 
    mPaint.setTextSize(mTextSize); 
    mPaint.setColor(mTextColor); 
 
  } 
   
  /** 
   * get the styled attributes 
   * 
   * @param attrs 
   */ 
  private void obtainStyledAttributes(AttributeSet attrs) 
  { 
    // init values from custom attributes 
    final TypedArray attributes = getContext().obtainStyledAttributes( 
        attrs, R.styleable.HorizontalProgressBarWithNumber); 
 
    mTextColor = attributes 
        .getColor( 
            R.styleable.HorizontalProgressBarWithNumber_progress_text_color, 
            DEFAULT_TEXT_COLOR); 
    mTextSize = (int) attributes.getDimension( 
        R.styleable.HorizontalProgressBarWithNumber_progress_text_size, 
        mTextSize); 
 
    mReachedBarColor = attributes 
        .getColor( 
            R.styleable.HorizontalProgressBarWithNumber_progress_reached_color, 
            mTextColor); 
    mUnReachedBarColor = attributes 
        .getColor( 
            R.styleable.HorizontalProgressBarWithNumber_progress_unreached_color, 
            DEFAULT_COLOR_UNREACHED_COLOR); 
    mReachedProgressBarHeight = (int) attributes 
        .getDimension( 
            R.styleable.HorizontalProgressBarWithNumber_progress_reached_bar_height, 
            mReachedProgressBarHeight); 
    mUnReachedProgressBarHeight = (int) attributes 
        .getDimension( 
            R.styleable.HorizontalProgressBarWithNumber_progress_unreached_bar_height, 
            mUnReachedProgressBarHeight); 
    mTextOffset = (int) attributes 
        .getDimension( 
            R.styleable.HorizontalProgressBarWithNumber_progress_text_offset, 
            mTextOffset); 
 
    int textVisible = attributes 
        .getInt(R.styleable.HorizontalProgressBarWithNumber_progress_text_visibility, 
            VISIBLE); 
    if (textVisible != VISIBLE) 
    { 
      mIfDrawText = false; 
    } 
    attributes.recycle(); 
  } 

嗯,看起來代碼挺長,其實都是在獲得自界說屬性,沒甚麼技巧含量。

(3)onMeasure
適才不是出onDraw外面寫寫就好了麼,為何要改onMeasure呢,重要是由於我們一切的屬性好比進度條寬度讓用戶自界說了,所以我們的丈量也得略微變下。

@Override 
protected synchronized void onMeasure(int widthMeasureSpec, 
    int heightMeasureSpec) 
{ 
  int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
 
  if (heightMode != MeasureSpec.EXACTLY) 
  { 
 
    float textHeight = (mPaint.descent() + mPaint.ascent()); 
    int exceptHeight = (int) (getPaddingTop() + getPaddingBottom() + Math 
        .max(Math.max(mReachedProgressBarHeight, 
            mUnReachedProgressBarHeight), Math.abs(textHeight))); 
 
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(exceptHeight, 
        MeasureSpec.EXACTLY); 
  } 
  super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
 
} 

寬度我們不變,所以的自界說屬性不觸及寬度,高度呢,只斟酌不是EXACTLY的情形(用戶明白指定了,我們就不論了),依據padding和進度條寬度算出本身想要的,假如非EXACTLY下,我們停止exceptHeight封裝,傳入給控件停止丈量高度。
丈量完,就到我們的onDraw了~~~
(4)onDraw

@Override 
  protected synchronized void onDraw(Canvas canvas) 
  { 
    canvas.save(); 
    //畫筆平移到指定paddingLeft, getHeight() / 2地位,留意今後坐標都為以此為0,0 
    canvas.translate(getPaddingLeft(), getHeight() / 2); 
 
    boolean noNeedBg = false; 
    //以後進度和總值的比例 
    float radio = getProgress() * 1.0f / getMax(); 
    //已達到的寬度 
    float progressPosX = (int) (mRealWidth * radio); 
    //繪制的文本 
    String text = getProgress() + "%"; 
 
    //拿到字體的寬度和高度 
    float textWidth = mPaint.measureText(text); 
    float textHeight = (mPaint.descent() + mPaint.ascent()) / 2; 
 
    //假如達到最初,則未達到的進度條不須要繪制 
    if (progressPosX + textWidth > mRealWidth) 
    { 
      progressPosX = mRealWidth - textWidth; 
      noNeedBg = true; 
    } 
 
    // 繪制已達到的進度 
    float endX = progressPosX - mTextOffset / 2; 
    if (endX > 0) 
    { 
      mPaint.setColor(mReachedBarColor); 
      mPaint.setStrokeWidth(mReachedProgressBarHeight); 
      canvas.drawLine(0, 0, endX, 0, mPaint); 
    } 
   
    // 繪制文本 
    if (mIfDrawText) 
    { 
      mPaint.setColor(mTextColor); 
      canvas.drawText(text, progressPosX, -textHeight, mPaint); 
    } 
 
    // 繪制未達到的進度條 
    if (!noNeedBg) 
    { 
      float start = progressPosX + mTextOffset / 2 + textWidth; 
      mPaint.setColor(mUnReachedBarColor); 
      mPaint.setStrokeWidth(mUnReachedProgressBarHeight); 
      canvas.drawLine(start, 0, mRealWidth, 0, mPaint); 
    } 
 
    canvas.restore(); 
 
  } 
 
  @Override 
  protected void onSizeChanged(int w, int h, int oldw, int oldh) 
  { 
    super.onSizeChanged(w, h, oldw, oldh); 
    mRealWidth = w - getPaddingRight() - getPaddingLeft(); 
 
  } 

其實焦點辦法就是onDraw了,然則呢,onDraw也很簡略,繪制線、繪制文本、繪制線,停止。

還有兩個簡略的幫助辦法:

/** 
 * dp 2 px 
 * 
 * @param dpVal 
 */ 
protected int dp2px(int dpVal) 
{ 
  return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
      dpVal, getResources().getDisplayMetrics()); 
} 
 
/** 
 * sp 2 px 
 * 
 * @param spVal 
 * @return 
 */ 
protected int sp2px(int spVal) 
{ 
  return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 
      spVal, getResources().getDisplayMetrics()); 
 
} 

好了,到此我們的橫向進度就停止了,是否是很簡略~~假如你是自界說View,你還得斟酌progress的更新,斟酌狀況的燒毀與恢復等等龐雜的器械。
接上去看我們的RoundProgressBarWidthNumber圓形的進度條。

2、RoundProgressBarWidthNumber   
圓形的進度條和橫向的進度條根本變量都是分歧的,因而我就讓RoundProgressBarWidthNumber extends HorizontalProgressBarWithNumber 了。
然後須要轉變的就是丈量和onDraw了:
完全代碼:

package com.zhy.view; 
 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Canvas; 
import android.graphics.Paint.Cap; 
import android.graphics.Paint.Style; 
import android.graphics.RectF; 
import android.util.AttributeSet; 
 
import com.zhy.library.view.R; 
 
public class RoundProgressBarWidthNumber extends 
    HorizontalProgressBarWithNumber { 
  /** 
   * mRadius of view 
   */ 
  private int mRadius = dp2px(30); 
 
  public RoundProgressBarWidthNumber(Context context) { 
    this(context, null); 
  } 
 
  public RoundProgressBarWidthNumber(Context context, AttributeSet attrs) { 
    super(context, attrs); 
 
    mReachedProgressBarHeight = (int) (mUnReachedProgressBarHeight * 2.5f); 
    TypedArray ta = context.obtainStyledAttributes(attrs, 
        R.styleable.RoundProgressBarWidthNumber); 
    mRadius = (int) ta.getDimension( 
        R.styleable.RoundProgressBarWidthNumber_radius, mRadius); 
    ta.recycle(); 
 
    mTextSize = sp2px(14); 
 
    mPaint.setStyle(Style.STROKE); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setStrokeCap(Cap.ROUND); 
 
  } 
 
  @Override 
  protected synchronized void onMeasure(int widthMeasureSpec, 
      int heightMeasureSpec) { 
    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
 
    int paintWidth = Math.max(mReachedProgressBarHeight, 
        mUnReachedProgressBarHeight); 
 
    if (heightMode != MeasureSpec.EXACTLY) { 
 
      int exceptHeight = (int) (getPaddingTop() + getPaddingBottom() 
          + mRadius * 2 + paintWidth); 
      heightMeasureSpec = MeasureSpec.makeMeasureSpec(exceptHeight, 
          MeasureSpec.EXACTLY); 
    } 
    if (widthMode != MeasureSpec.EXACTLY) { 
      int exceptWidth = (int) (getPaddingLeft() + getPaddingRight() 
          + mRadius * 2 + paintWidth); 
      widthMeasureSpec = MeasureSpec.makeMeasureSpec(exceptWidth, 
          MeasureSpec.EXACTLY); 
    } 
 
    super.onMeasure(heightMeasureSpec, heightMeasureSpec); 
 
  } 
 
  @Override 
  protected synchronized void onDraw(Canvas canvas) { 
 
    String text = getProgress() + "%"; 
    // mPaint.getTextBounds(text, 0, text.length(), mTextBound); 
    float textWidth = mPaint.measureText(text); 
    float textHeight = (mPaint.descent() + mPaint.ascent()) / 2; 
 
    canvas.save(); 
    canvas.translate(getPaddingLeft(), getPaddingTop()); 
    mPaint.setStyle(Style.STROKE); 
    // draw unreaded bar 
    mPaint.setColor(mUnReachedBarColor); 
    mPaint.setStrokeWidth(mUnReachedProgressBarHeight); 
    canvas.drawCircle(mRadius, mRadius, mRadius, mPaint); 
    // draw reached bar 
    mPaint.setColor(mReachedBarColor); 
    mPaint.setStrokeWidth(mReachedProgressBarHeight); 
    float sweepAngle = getProgress() * 1.0f / getMax() * 360; 
    canvas.drawArc(new RectF(0, 0, mRadius * 2, mRadius * 2), 0, 
        sweepAngle, false, mPaint); 
    // draw text 
    mPaint.setStyle(Style.FILL); 
    canvas.drawText(text, mRadius - textWidth / 2, mRadius - textHeight, 
        mPaint); 
 
    canvas.restore(); 
 
  } 
 
} 

起首獲得它的專有屬性mRadius,然後依據此屬性去丈量,丈量完成繪制;
繪制的進程呢?
先繪制一個細一點的圓,然後繪制一個粗一點的弧度,兩者疊在一路就行。文本呢,繪制在中央~~~整體,沒甚麼代碼量。
好了,兩個進度條就到這了,是否是發明簡略許多。整體設計上,存在些成績,假如抽取一個BaseProgressBar用於獲得公共的屬性;然後分歧模樣的進度條繼續分離完成本身的丈量和模樣,如許構造能夠會清楚些~~~

3、應用
結構文件

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:tools="http://schemas.android.com/tools" 
  xmlns:zhy="http://schemas.android.com/apk/res-auto" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" > 
 
  <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="25dp" > 
 
    <com.zhy.view.HorizontalProgressBarWithNumber 
      android:id="@+id/id_progressbar01" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="50dip" 
      android:padding="5dp" /> 
 
     
 
    <com.zhy.view.HorizontalProgressBarWithNumber 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="50dip" 
      android:padding="5dp" 
      android:progress="50" 
      zhy:progress_text_color="#ffF53B03" 
      zhy:progress_unreached_color="#ffF7C6B7" /> 
 
    <com.zhy.view.RoundProgressBarWidthNumber 
      android:id="@+id/id_progress02" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="50dip" 
      android:padding="5dp" 
      android:progress="30" /> 
 
    <com.zhy.view.RoundProgressBarWidthNumber 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="50dip" 
      android:padding="5dp" 
      android:progress="50" 
      zhy:progress_reached_bar_height="20dp" 
      zhy:progress_text_color="#ffF53B03" 
      zhy:radius="60dp" /> 
    
  </LinearLayout> 
 
</ScrollView> 

MainActivity

package com.zhy.sample.progressbar; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
 
import com.zhy.annotation.Log; 
import com.zhy.view.HorizontalProgressBarWithNumber; 
 
public class MainActivity extends Activity { 
 
  private HorizontalProgressBarWithNumber mProgressBar; 
  private static final int MSG_PROGRESS_UPDATE = 0x110; 
 
  private Handler mHandler = new Handler() { 
    @Log 
    public void handleMessage(android.os.Message msg) { 
      int progress = mProgressBar.getProgress(); 
      mProgressBar.setProgress(++progress); 
      if (progress >= 100) { 
        mHandler.removeMessages(MSG_PROGRESS_UPDATE); 
         
      } 
      mHandler.sendEmptyMessageDelayed(MSG_PROGRESS_UPDATE, 100); 
    }; 
  }; 
 
  @Log 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mProgressBar = (HorizontalProgressBarWithNumber) findViewById(R.id.id_progressbar01); 
    mHandler.sendEmptyMessage(MSG_PROGRESS_UPDATE); 
 
  } 
 
} 

; public static string GetHtml(string URL, string cookie, out string header, string server)
        {
            return GetHtml(URL, cookie, out header, server, "");
        }
        /// <summary>
        /// Get形式閱讀
        /// </summary>
        /// <param name="URL">Get網址 </param>
        /// <param name="cookie">cookie </param>
        /// <param name="header">句柄 </param>
        /// <param name="server">辦事器地址 </param>
        /// <param name="val"> </param>
        /// <returns> </returns>
        public static string GetHtml(string URL, string cookie, out string header, string server, string val)
        {
            HttpWebRequest httpWebRequest;
            HttpWebResponse webResponse;
            Stream getStream;
            StreamReader streamReader;
            string getString = "";
            httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
            httpWebRequest.Accept = "*/*";
            httpWebRequest.Referer = server;
            CookieContainer co = new CookieContainer();
            co.SetCookies(new Uri(server), cookie);
            httpWebRequest.CookieContainer = co;
            httpWebRequest.UserAgent =
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)";
            httpWebRequest.Method = "GET";
            webResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            header = webResponse.Headers.ToString();
            getStream = webResponse.GetResponseStream();
            streamReader = new StreamReader(getStream, Encoding.GetEncoding("gb2312"));
            getString = streamReader.ReadToEnd();
            streamReader.Close();
            getStream.Close();
            return getString;
        }
   }
}

願望本文所述對年夜家的C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved