Android Studio --- [學習筆記]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手

說明

  • 源代碼
  • 2.x里有TCP的三次揮手與四次握手,先對它進行簡單的回答(百度).預計在下一篇里,會繼續說明TCP
  • 接上一篇: Android Studio — > [學習筆記]Button、TextView、EditText

2.5 RadioButton

  • 常用屬性
  • 自定義樣式
  • 監聽事件

2.5.1 新建按鈕,并跳轉到相應的活動頁面

1.在com.skypan.textview下新建一個RadioButtonActivity活動
2.在主樣式,新增一個 RadioButton按鈕

<Buttonandroid:id="@+id/btn_radiobutton"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Radio Button"android:textAllCaps="false"/>

3.在主活動中,添加按鈕的跳轉事件

public class MainActivity extends AppCompatActivity {// 聲明按鈕private Button mBtnRadioButton;@overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBtnRadioButton = (Button) findViewById(R.id.btn_radiobutton);mBtnRadioButton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {// 跳轉到 RadioButton 界面Intent intent = new Intent(MainActivity.this, RadioButtonActivity.class);startActivity(intent);}})}
}

2.5.2 封裝View.OnClickListener

[說明] : 在主活動中,多次使用到這個方法,其中僅僅部分改變.因此將該方法提取出來.
1.提取出方法

private class OnClick implements View.OnClickListener{@Overridepublic void onClick(View v) {Intent intent = null;switch (v.getId()){case R.id.btn_textview:// 跳轉到 TextView 演示界面intent = new Intent(MainActivity.this, TextViewActivity.class);break;case R.id.btn_button:intent = new Intent(MainActivity.this, ButtonActivity.class);break;case R.id.btn_edittext:intent = new Intent(MainActivity.this, EditTextActivity.class);break;case R.id.btn_radiobutton:intent = new Intent(MainActivity.this, RadioButtonActivity.class);break;}startActivity(intent);}
}

2.設置啟動函數

private void setListeners(){Onclick onclick = new Onclick();mBtnTextView.setOnClickListener(onClick);mBtnButton.setOnClickListener(onClick);mBtnEditText.setOnClickListener(onClick);mBtnRadioButton.setOnClickListener(onClick);
}

2.5.3 單選按鈕的監聽事件:

  • 按鈕組的布局如下:
<RadioGroupandroid:id="@+id/rg_1"...
/><RadioButtonandroid:id="@+id/rb_1"android:text=""/><RadioButtonandroid:id="@+id/rb_2"android:id=""/>
</RadioGroup>
  • 監聽函數如下:
public class RadioButtonActivity extends AppCompatActivity {private RadioGroup mRg1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mRg1 = (RadioGroup) findViewById(R.id.rg_1);mRg1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {RadioButton radioButton = (RadioButton) group.findViewById(checkedId);Toast.makeText(RadioButtonActivity.this, radioButton.getText(),Toast.LENGTH.SHORT).show();}})}
}

[說明] :
1.一個活動對應的是一個類
2.所有活動都繼承一個基類AppCompatActiviry
3.protected: 自己和子類都能使用.
4.private: 除了自己之外,其他類都無法使用

2.5.x 參數說明:

1.android:checked: 默認選中
2.android:state_checked="true": 點擊時顯示的樣式
3.<solid android:color="#cc7a00">: 一個矩形的顏色填充塊
4.<stroke android:width="1dp">: 1個單位寬度的矩形線
5.corners android:radius="15dp": 矩形的邊角曲率15個單位

[報錯]:
1.Variable 'intent' might not have been initialized: 變量intent沒有初始化

2.6 復選框 CheckBox

  • 常用屬性
  • 自定義樣式
  • 監聽事件

2.6.1 線性垂直布局 + 復選框基本語法

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_below="@id/cb_6"android:layout_marginTop="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="你的興趣:"android:textColor="#000"/><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/cb_7"android:text="編程"android:textSize="20sp"android:layout_marginTop="5sp" /><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/cb_8"android:text="編程"android:textSize="20sp"android:layout_marginTop="5sp"/></LinearLayout>

2.6.2 制作帶圖標的復選框

1.準備好2個圖標 icon1icon2
2.將2個圖標放入res/drawable-xxhdpi
3.準備選擇器: bg_check.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:state_checked="false"android:drawable="@drawable/icon_checkbox_false" /><itemandroid:state_checked="true"android:drawable="@drawable/icon_checkbox_true" />
</selector>

[說明] :

  • (1)android:state_checked='false': 未選中
  • (2)android:drawble='@drawable/icon_checkbox_false': 使用icon_checkbox_false圖標

4.在CheckBox中使用 Selector: bg_check.xml

<CheckBox...android:button="@drawable/bg_check"
>

2.6.3 給復選框添加事件

1.假設復選框的id為 cb_1cb_2
2.編寫復選框的活動如下: CheckBoxActivity.java

public class CheckBoxActivity extends AppCompatActivity {// 聲明控件private  CheckBox mCb1, mCb2;@overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 獲取控件的視圖mCb1 = (CheckBox) findViewById(R.id.cb_1);mCb2 = (CheckBox) findViewById(R.id.cb_2);mCb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){@overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Toast.makeText(CheckBoxActivity.this, isChecked? '1選中': '1取消', Toast.LENGTH_SHORT).show();}})mCb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){@overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Toast.makeText(CheckBoxActivity.this, isChecked? '2選中': '2取消', Toast.LENGTH_SHORT).show();}})}
}

2.7 ImageView

  • Button的其他衍生控件: ToggleButton、Switch(略)
  • 常用屬性
  • 加載網絡圖片

2.7.1 最基本的ImageView語法

  • activity_image_view.xml
<ImageViewandroid:layout_width="300dp"android:layout_height="200dp"android:background="#ff9900"android:src="@drawable/bg_icon_man"android:scaleType="fixXY"/>

[說明] :
1.android:scaleType="fixXY": 撐滿控件,寬高比可能發生變化
2.android:scaleType="fitCenter": 保持寬高比縮放,直到能完全顯示
3.android:scaleType="centerCrop": 保持寬高比縮放,直至完全覆蓋控件,裁剪顯示

2.7.2 使用ImageView加載一張網絡圖片

1.寫好控件: activity_image_view.xml

<ImageViewandroid:id="@+id/iv_4"android:layout_width="200dp"android:layout_height="100dp"/>

2.配置glide: /app/build.gradle

repositories {mavenCentral()google()
}
dependencies {implementation 'com.github.bumptech.glide:glide:4.10.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
}

[說明] :

  • (1)使用glide進行網絡資源請求
  • (2)Android Studio編譯器可以自動的按照 build.gradle 中的配置進行Jar包同步

3.獲取控件iv_4,并使用glide往里面加資源

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import com.bumptech.glide.Glide;public class ImageViewActivity extends AppCompatActivity {private ImageView mIv4;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_view);mIv4 = (ImageView) findViewById(R.id.iv_4);Glide.with(this).load("https://www.baidu.com/img/bd_logo1.png").into(mIv4);}
}

[報錯] :

  • 1)Request threw uncaught throwable java.lang.SecurityException: Permission denied (missing INTERNET permission?): 使用glide進行網絡請求時,需要配置權限.在路徑/app/src/main/AndroidMainfest.xml中添加網絡權限如下:
<use-permission android:name="android.permission.INTERNET"  />

2.8 列表視圖ListView(知道,被RecyclerView替代)

  • 常用屬性
  • Adapter接口
  • Demo演示

2.8.1 創建一個ListViewActivity(手動導入依賴)

  • 1)在com.skypan.textview包下,新建一個包listview
  • 2)在listview下,新建一個Java類.注意: Name: ListViewActivitySuperclass: android.app.Activity
  • 3)創建視圖: activity_listview.xml, 在路徑 /app/src/main/res/layout
  • 4)完善ListViewActivity.java:
package com.skypan.textview.listview;
import android.app.Activity;
import andoird.os.Bundle;
import androidx.annotation.Nullable;
import com.skypan.textview.R;public class ListViewActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_listview);}
}
  • 5)將AndroidManifex.xml聲明ListViewActivity.java
<activity android:name=".listview.ListViewActivity" />

2.8.2 自定義顏色 + 使用

  • 1)在/app/src/main/res/values/colors.xml中寫入自定義顏色,如下
<resources><color name="colorGray">#D5D5D5</color>
</resources>
  • 2)使用
<TextViewandroid:textColor="@color/colorGrayDark" />

2.8.3 自定義List View 按壓樣式

  • 1)新建一個選擇器(Selector): /app/src/main/res/drawable -> new Drawable Resource file -> layout_list_item.xml
  • 2)list_item.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@color/colorAcecent" android:state_pressed="true" /><item android:drawable="@color/colorWhite" android:state_pressed="false" />
</selector>
  • 3)在List View中使用: activity_listview.xml
<ListViewandroid:id="@+id/lv_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:listSelector="@drawable/list_item" />

2.8.4 List View的點擊事件

[參數]:

  • 1)setOnItemClickListener: 點擊事件
  • 2)setOnItemLongClickListener: 長按事件
import android.app.Activity;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.ListViewpublic class ListViewActivity extends Activity {// 聲明 ListView控件private ListView mLv1;@Overrideprotected void onCrete(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_listview);mLv1 = (ListView) findViewById(R.id.lv_1);mLv1.setAdapter(new MyListAdapter(ListViewActivity.this));mLv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Toast.makeText(ListViewActivity.this, text:"點擊了" + position, Toast.LENGTH_SHORT).show();}});}
}

[說明] :

  • 1)公有類ListViewActivity繼承安卓的app下面的公有類Activity
  • 2)ListView來自Android.widget.ListView
  • 3)適配器類MyListAdapter代碼如下:@/src/main/java/com.skypan.textview/listview/MyListAdapter.java
package com.skypan.textview.listview;import android.widget.BaseAdapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.TextView;
import android.view.View;
import android.view.ViewGroup;import com.bumptech.glide.Glide;
import com.skypan.textview.R;public class MyListAdapter extends BaseAdapter {private Context mContext;private LayoutInflater mLayoutInflater;public MyListAdapter(Context context) {this.mContext = context;mLayoutInflater = LayoutInflater.from(context);}@Overridepublic int getCount() { return 10; }@Overridepublic Object getItem(int position) { return null; }@Overridepublic long getItemId(int position) { return 0; }static class ViewHolders {public ImageView imageView;public TextView tvTitle, tvTime, tvContent;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if(convertView == null) {convertView = mLayoutInflater.inflate(R.layout.layout_list_item, null);holder = new ViewHolder();holder.imageView = (ImageView) convertView.findViewById(R.id.iv);holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);hodler.tvTime = (TextView) convertView.findViewById(R.id.tv_time);hodler.tvContent = (TextView) convertView.findViewById(R.id.tv_content);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}// 給控件賦值holder.tvTitle.setText('這是標題');holder.tvTime.setText('2088-08-08');holder.tvContent.setText('這是內容吶~!');Glide.with(mContext).load("https://www.baidu.com/img/bd_logo1.png").into(holder.imageView);return convertView;}
}

2.x TCP的三次握手與四次揮手

  • 原址
  • 1)請畫出三次握手和四次揮手的示意圖(略)
  • 2)為什么連接的時候是三次握手?
    參考

[try]:

  • (1)TCP作為一種可靠傳輸控制協議,其核心思想是: 既要保證數據可靠傳輸,又要提高傳輸的效率,而用三次恰恰可以滿足以上兩種方法.

  • (2)TCP可靠傳輸的精髓,TCP連接的一方A,由操作系統動態隨機選取一個32位長的序列號(Initial Sequelize Number),假設A的初始序列號為1000,以該序列號為原點,對自己將要發送的每個字節的數據進行編號,1001,1002,1003…,并把自己的初始序號ISN告訴B,告訴B什么樣編號的數據是合法的,什么編號的數據是非合法的,同時B還可以對A每一個編號的字節數據進行確認。如果A收到B的確認編號2001,則意味著字節編號1001~2000,共1000個字節已經安全到達

  • 3)什么是半連接隊列?
    [try]: 在TCP三次握手中的第一次握手,客戶端向服務器發送SYN包,客戶端將該連接保存在半連接隊列中

  • 4)ISN(Initial Sequence Number)是固定的嗎?
    [try]: 不是固定的,隨機ISN能避免非同一網絡的攻擊

  • 5)三次握手過程可以攜帶數據嗎?
    [try]: 根據RFC793標準,TCP的前2次握手不允許攜帶數據,但是第三次握手允許攜帶數據

  • 6)如果第三次握手丟失了,客戶端/服務端 會如何處理?
    參考

[try]:

  • (1)Server端: 此時Server端的狀態為SYN_RECV,并且會根據TCP的超時重傳機制,會等待3秒、6秒、12秒后重新發送 SYN + ACK 包,以便Client重新發送ACK包.而Server重發SYN + ACK包的次數,可以通過設置/proc/sys/net/ipv4/tcp_synack_retries修改,默認值為5.如果重發次數達到指定的次數仍未收到client的ACK應答,那么一段時間后,Server自動關閉這個連接.
  • (2)Client端: Linux C中,client接收到 SYN + ACK包之后,它的TCP狀態就為established,表示該連接已經建立.如果第三次握手中的ACK包丟失的情況下,Client向Server端發送數據,Server端將以RST包響應,方能感知Server的錯誤.
  • 7)SYN攻擊是什么?
    [try]: TCP連接建立時,只發送 SYN包, 而不發送 ACK包.
  • 8)揮手為什么需要四次? (后面解讀)
  • 9)四次揮手釋放連接時,等待2MSL的意義? (后面解讀)

2.x.x TCP全連接/半連接隊列

  • 原址

  • 1)什么是半連接隊列,全連接隊列?
    [a] Linux內核協議棧為一個tcp連接管理使用兩個隊列,一個是半連接隊列(用來保存SYN_SEN和SYN_RECV狀態的請求),一個是全連接隊列(acceptd隊列)(用來保存處于established狀態,但是應用層沒有調用accept取走的請求.)

  • 2)TCP連接基本概念

    • 三次握手
      (1)第一次握手: 客戶端發送syn包(syn=i)到服務器,并進入SYN_SEND狀態,并等待服務器確認;
      (2)第二次握手: 服務器收到syn包,必須確認客戶的SYN(ack=j+1), 同時也發送一個SYN包(syn=k), 即SYN + ACK包, 此時服務器進入 SYN_RECV 狀態.
      (3)第三次握手: 客戶端收到服務器的 SYN + ACK包,向服務器發送ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手.
  • 3)半連接隊列(sync queue) 和 全連接隊列(accept queue)

    • (1)sync queue: 是服務器接收到客戶端的第一次握手請求SYN后,將該連接加入到隊列中,當收到客戶端的ACK后,從列表中移出
    • (2)accept queue: 是服務器收到客戶端ACK后,將連接加入到的隊列,在連接進行accept處理后,從隊列中移出.
  • 4)黑客攻擊 - SYN洪水(SYN FLOOD)

    • SYN攻擊屬于DOS攻擊的一種,它利用TCP協議缺陷,通過發送大量的SYN請求,而不回復ACK,占用大量服務器的半連接隊列資源,進而導致隊列溢出,無法響應正常的連接請求,耗費CPU和內存資源.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250396.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洛谷3171 網絡吞吐量(網絡流)

t開成n結果cur賦值的時候也只賦值到t令人智熄 【題目分析】 好吧我承認這個錯誤真的呵呵。。。。。。。。 題目有那~~~~~么長&#xff0c;然后畫畫圖這道題就基本看出正解了&#xff0c;再一看數據范圍&#xff0c;n<500簡直良心&#xff0c;好了&#xff0c;網絡流沒得跑了…

DIV+CSS布局的優勢和弊端

DIVCSS的優勢1、符合W3C標準。這保證您的網站不會因為將來網絡應用的升級而被淘汰。2、對瀏覽者和瀏覽器更具親和力。由于CSS富含豐富的樣式&#xff0c;使頁面更加靈活性&#xff0c;它可以根據不同的瀏覽器&#xff0c;而達到顯示效果的統一和不變形。這樣就支持瀏覽器的向后…

Android Studio --- [學習筆記]TCP(第2彈)、GridView、ScrollView

說明 這篇主要接上一篇Android Studio — > [學習筆記]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手對上面回答的細解,并用JS偽代碼,對TCP三次握手和四次揮手的簡單實現.Android的基本了解到此篇結束,后續會根據具體情況深度學習. 2.y TCP的三次握手和四次揮…

MySQL中varchar最大長度是多少

一. varchar存儲規則&#xff1a; 4.0版本以下&#xff0c;varchar(20)&#xff0c;指的是20字節&#xff0c;如果存放UTF8漢字時&#xff0c;只能存6個&#xff08;每個漢字3字節&#xff09; 5.0版本以上&#xff0c;varchar(20)&#xff0c;指的是20字符&#xff0c;無論存放…

bzoj 1232: [Usaco2008Nov]安慰奶牛cheer【最小生成樹】

有趣 每條邊在算答案的時候被算了二倍的邊權值加上兩個端點的權值&#xff0c;然后睡覺點額外加一次 所以可以用這個權做MST&#xff0c;然后加上點權最小的點 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N1…

JavaScript --- [學習筆記]觀察者模式 理解對象 工廠模式 構造函數模式

說明 本系列(JS基礎梳理)為后面TCP的模擬實現做準備本篇的主要內容: 觀察者模式、工廠模式、構造函數模式 和 對對象的理解 1. 觀察者模式 參考JavaScript設計模式 1.1 消息注冊方法 “將訂閱者注冊的消息推入到消息隊列中” [算法思路] : 在推入到消息隊列時,如果此消息…

java_day19_MVC和配置文件

簡單的MVC設計 MVC的全名是Model View Controller&#xff0c;是模型(model)&#xff0d;視圖(view)&#xff0d;控制器(controller)的縮寫&#xff0c;是一種軟件設計典范。它是用一種業務邏輯、數據與界面顯示分離的方法來組織代碼&#xff0c;將眾多的業務邏輯聚集到一個部件…

Problem I: 打印金字塔

#include<stdio.h> int main() {int n,i,j,k;scanf("%d",&n);for(i1;i<n;i){for(j1;j<n-i;j)printf(" ");for(k1;k<2*i-1;k)printf("*");printf("\n");}return 0; } HINT 用雙重循環做&#xff0c;外循環代表行數&…

webpack --- 發布環境的配置 代碼壓縮 代碼分類

說明 源代碼本篇主要對發布環境的配置說明前面2點是對webpack的一個復習.第3點開始,逐步配置部署代碼 1. Webpack發布的策略 2.1 在實際開發中,一般會有兩套方案: 開發期間的項目:包含了測試文件、測試數據、開發工具、測試工具等相關配置,有利于項目的開發和測試,但是這些文…

salesforce lightning零基礎學習(三) 表達式的!(綁定表達式)與 #(非綁定表達式)

在salesforce的classic中&#xff0c;我們使用{!expresion}在前臺頁面展示信息&#xff0c;在lightning中&#xff0c;上一篇我們也提及了&#xff0c;如果展示attribute的值&#xff0c;可以使用{!v.expresion}展示信息。 lightning在component中解析動態值的時候&#xff0c;…

sqlserver學習3---sql函數

一、SQL DML 和 DDL 可以把 SQL 分為兩個部分&#xff1a;數據操作語言 (DML) 和 數據定義語言 (DDL)。 SQL (結構化查詢語言)是用于執行查詢的語法。但是 SQL 語言也包含用于更新、插入和刪除記錄的語法。 查詢和更新指令構成了 SQL 的 DML 部分&#xff1a; SELECT - 從數據庫…

JavaScript --- [學習筆記] 原型模式

說明 接JavaScript — > [學習筆記]觀察者模式 & 理解對象 & 工廠模式 & 構造函數模式上一篇構造函數模式創建的實例,不同實例的同一個方法是不相等的,為了解決這個問題.出現了原型模式 1. 原型模式 具體做法是,不在構造函數中定義對象實例的信息,而是將這些…

網絡協議各層概述

網絡協議概述 OSI是一個開放性的通信系統互連參考模型&#xff0c;他是一個定義得非常好的協議規范。OSI模型有7層結構&#xff0c;每層都可以有幾個子層。 OSI的7層從上到下分別是 7 應用層 6 表示層 5 會話層 4 傳輸層 3 網絡層 2 數據鏈路層 1 物理層&#xff1b; 其中高層&…

A start job is running for Raise network interface(5min 13s )問題解決方法

命令&#xff1a;sudo vim /etc/systemd/system/network-online.target.wants/networking.service將里面的TimeoutStartSec5min 修改為TimeoutStartSec2sec 然后重啟系統&#xff0c;就可以生效了&#xff0c;開機速度很快 轉載于:https://www.cnblogs.com/sea-stream/p/98615…

javascript --- 實現對象的深拷貝

淺拷貝和深拷貝 淺拷貝: 只拷貝一層.當對象是復雜數據類型(Object、 Array)時,只拷貝引用深拷貝: 多層拷貝.復雜數據類型,會重新分配內存空間. 實現淺拷貝的2種方法 使用for ... in 實現 var obj {name: marron,age: 18,msg: {sex: "1" } } var o {}; for(let …

Qt與FFmpeg聯合開發指南(二)——解碼(2):封裝和界面設計

與解碼相關的主要代碼在上一篇博客中已經做了介紹&#xff0c;本篇我們會先討論一下如何控制解碼速度再提供一個我個人的封裝思路。最后回歸到界面設計環節重點看一下如何保證播放器界面在縮放和拖動的過程中保證視頻畫面的寬高比例。 一、解碼速度 播放器播放媒體文件的時候播…

Bzoj1051 受歡迎的牛

每一頭牛的愿望就是變成一頭最受歡迎的牛。現在有 N 頭牛&#xff0c;給你 M 對整數 (A,B)&#xff0c;表示牛 A 認為牛 B 受歡迎。這種關系是具有傳遞性的&#xff0c;如果 A 認為 B 受歡迎&#xff0c;B 認為 C 受歡迎&#xff0c;那么牛 A 也認為牛 C 受歡迎。你的任務是求出…

node --- 模塊加載機制

1. Node.js中模塊加載機制 1.1 模塊查找規則-當模塊擁有路徑但沒有后綴時 require(./find.js); require(./find);require方法根據模塊路徑查找模塊,如果是完整路徑,直接進入模塊如果模塊后綴省略,先找同名JS文件再找同名JS文件夾 require(./find); // 以上會先找到命令行目錄…

51Nod 蜥蜴和地下室(搜索)

哈利喜歡玩角色扮演的電腦游戲《蜥蜴和地下室》。此時&#xff0c;他正在扮演一個魔術師。在最后一關&#xff0c;他必須和一排的弓箭手戰斗。他唯一能消滅他們的辦法是一個火球咒語。如果哈利用他的火球咒語攻擊第i個弓箭手&#xff08;他們從左到右標記&#xff09;&#xff…

多線程——實現Runnable接口實現一個多線程

實現Runnable接口實現一個多線程 Runnable接口源碼&#xff1a; package java.lang; //Runnable接口源碼只有一個run方法 public interface Runnable {public abstract void run(); } 實現Runnable的兩個多線程類&#xff1a; public class RunnableThread1 implements Runnabl…