杞浇璇锋敞鏄庡嚭澶勶細http://blog.****.net/guolin_blog/article/details/17357967
涓嶇煡涓嶈涓紝甯︿綘涓€姝ユ娣卞叆浜嗚ВView绯诲垪鐨勬枃绔犲凡缁忓啓鍒扮鍥涚瘒浜嗭紝鍥為【涓€涓嬶紝鎴戜滑涓€鍏卞涔犱簡LayoutInflater鐨勫師鐞嗗垎鏋愩€佽鍥剧殑缁樺埗娴佺▼銆佽鍥剧殑鐘舵€佸強閲嶇粯绛夌煡璇嗭紝绠楁槸鎶奦iew涓緢澶氶噸瑕佺殑鐭ヨ瘑鐐归兘娑夊強鍒颁簡銆傚鏋滀綘杩樻病鏈夌湅杩囨垜鍓嶉潰鐨勫嚑绡囨枃绔狅紝寤鸿鍏堝幓闃呰涓€涓嬶紝澶氫簡瑙d竴浜涘師鐞嗘柟闈㈢殑涓滆タ銆?/p>
涔嬪墠鎴戞湁鎵胯杩囷紝浼氬湪View杩欎釜璇濋涓婂鍐欏嚑绡囧崥瀹紝璁蹭竴璁睼iew鐨勫伐浣滃師鐞嗭紝浠ュ強鑷畾涔塚iew鐨勬柟娉曘€傜幇鍦ㄥ墠鍗婇儴鍒嗙殑鎵胯宸茬粡濡傜害鍏戠幇浜嗭紝閭d箞浠婂ぉ鎴戝氨瑕佹潵鍏戠幇鍚庨潰閮ㄥ垎鐨勬壙璇猴紝璁蹭竴璁茶嚜瀹氫箟View鐨勫疄鐜版柟娉曪紝鍚屾椂杩欎篃鏄甫浣犱竴姝ユ娣卞叆浜嗚ВView绯诲垪鐨勫畬缁撶瘒銆?/p>
涓€浜涙帴瑙ndroid涓嶄箙鐨勬湅鍙嬪鑷畾涔塚iew閮芥湁涓€涓濈晱鎯ф劅锛屾€绘劅瑙夎繖鏄竴涓瘮杈冮珮绾х殑鎶€鏈紝浣嗗叾瀹炶嚜瀹氫箟View骞朵笉澶嶆潅锛屾湁鏃跺€欏彧闇€瑕佺畝鍗曞嚑琛屼唬鐮佸氨鍙互瀹屾垚浜嗐€?/p>
濡傛灉璇磋鎸夌被鍨嬫潵鍒掑垎鐨勮瘽锛岃嚜瀹氫箟View鐨勫疄鐜版柟寮忓ぇ姒傚彲浠ュ垎涓轰笁绉嶏紝鑷粯鎺т欢銆佺粍鍚堟帶浠躲€佷互鍙婄户鎵挎帶浠躲€傞偅涔堜笅闈㈡垜浠氨鏉ヤ緷娆″涔犱竴涓嬶紝姣忕鏂瑰紡鍒嗗埆鏄浣曡嚜瀹氫箟View鐨勩€?/p>
涓€銆佽嚜缁樻帶浠?/span>
鑷粯鎺т欢鐨勬剰鎬濆氨鏄紝杩欎釜View涓婃墍灞曠幇鐨勫唴瀹瑰叏閮ㄩ兘鏄垜浠嚜宸辩粯鍒跺嚭鏉ョ殑銆傜粯鍒剁殑浠g爜鏄啓鍦╫nDraw()鏂规硶涓殑锛岃€岃繖閮ㄥ垎鍐呭鎴戜滑宸茬粡鍦?a style="margin: 0px; padding: 0px; color: #0c89cf; font-family: 'Microsoft YaHei'; font-weight: bold; line-height: 30px;" target="_blank" href="http://blog.****.net/guolin_blog/article/details/16330267">Android瑙嗗浘缁樺埗娴佺▼瀹屽叏瑙f瀽锛屽甫浣犱竴姝ユ娣卞叆浜嗚ВView(浜?聽涓涔犺繃浜嗐€?/p>
涓嬮潰鎴戜滑鍑嗗鏉ヨ嚜瀹氫箟涓€涓鏁板櫒View锛岃繖涓猇iew鍙互鍝嶅簲鐢ㄦ埛鐨勭偣鍑讳簨浠讹紝骞惰嚜鍔ㄨ褰曚竴鍏辩偣鍑讳簡澶氬皯娆°€傛柊寤轰竴涓狢ounterView缁ф壙鑷猇iew锛屼唬鐮佸涓嬫墍绀猴細
- public聽class聽CounterView聽extends聽View聽implements聽OnClickListener聽{聽聽
- 聽聽
- 聽聽聽聽private聽Paint聽mPaint;聽聽
- 聽聽聽聽聽聽
- 聽聽聽聽private聽Rect聽mBounds;聽聽
- 聽聽
- 聽聽聽聽private聽int聽mCount;聽聽
- 聽聽聽聽聽聽
- 聽聽聽聽public聽CounterView(Context聽context,聽AttributeSet聽attrs)聽{聽聽
- 聽聽聽聽聽聽聽聽super(context,聽attrs);聽聽
- 聽聽聽聽聽聽聽聽mPaint聽=聽new聽Paint(Paint.ANTI_ALIAS_FLAG);聽聽
- 聽聽聽聽聽聽聽聽mBounds聽=聽new聽Rect();聽聽
- 聽聽聽聽聽聽聽聽setOnClickListener(this);聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽protected聽void聽onDraw(Canvas聽canvas)聽{聽聽
- 聽聽聽聽聽聽聽聽super.onDraw(canvas);聽聽
- 聽聽聽聽聽聽聽聽mPaint.setColor(Color.BLUE);聽聽
- 聽聽聽聽聽聽聽聽canvas.drawRect(0,聽0,聽getWidth(),聽getHeight(),聽mPaint);聽聽
- 聽聽聽聽聽聽聽聽mPaint.setColor(Color.YELLOW);聽聽
- 聽聽聽聽聽聽聽聽mPaint.setTextSize(30);聽聽
- 聽聽聽聽聽聽聽聽String聽text聽=聽String.valueOf(mCount);聽聽
- 聽聽聽聽聽聽聽聽mPaint.getTextBounds(text,聽0,聽text.length(),聽mBounds);聽聽
- 聽聽聽聽聽聽聽聽float聽textWidth聽=聽mBounds.width();聽聽
- 聽聽聽聽聽聽聽聽float聽textHeight聽=聽mBounds.height();聽聽
- 聽聽聽聽聽聽聽聽canvas.drawText(text,聽getWidth()聽/聽2聽-聽textWidth聽/聽2,聽getHeight()聽/聽2聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽+聽textHeight聽/聽2,聽mPaint);聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽void聽onClick(View聽v)聽{聽聽
- 聽聽聽聽聽聽聽聽mCount++;聽聽
- 聽聽聽聽聽聽聽聽invalidate();聽聽
- 聽聽聽聽}聽聽
- 聽聽
- }聽聽
鍙互鐪嬪埌锛岄鍏堟垜浠湪CounterView鐨勬瀯閫犲嚱鏁颁腑鍒濆鍖栦簡涓€浜涙暟鎹紝骞剁粰杩欎釜View鐨勬湰韬敞鍐屼簡鐐瑰嚮浜嬩欢锛岃繖鏍峰綋CounterView琚偣鍑荤殑鏃跺€欙紝onClick()鏂规硶灏变細寰楀埌璋冪敤銆傝€宱nClick()鏂规硶涓殑閫昏緫灏辨洿鍔犵畝鍗曚簡锛屽彧鏄mCount杩欎釜璁℃暟鍣ㄥ姞1锛岀劧鍚庤皟鐢╥nvalidate()鏂规硶銆傞€氳繃Android瑙嗗浘鐘舵€佸強閲嶇粯娴佺▼鍒嗘瀽锛屽甫浣犱竴姝ユ娣卞叆浜嗚ВView(涓?聽杩欑瘒鏂囩珷鐨勫涔犳垜浠兘宸茬粡鐭ラ亾锛岃皟鐢╥nvalidate()鏂规硶浼氬鑷磋鍥捐繘琛岄噸缁橈紝鍥犳onDraw()鏂规硶鍦ㄧ◢鍚庡氨灏嗕細寰楀埌璋冪敤銆?/span>
聽
鏃㈢劧CounterView鏄竴涓嚜缁樿鍥撅紝閭d箞鏈€涓昏鐨勯€昏緫褰撶劧灏辨槸鍐欏湪onDraw()鏂规硶閲岀殑浜嗭紝涓嬮潰鎴戜滑灏辨潵浠旂粏鐪嬩竴涓嬨€傝繖閲岄鍏堟槸灏哖aint鐢荤瑪璁剧疆涓鸿摑鑹诧紝鐒跺悗璋冪敤Canvas鐨刣rawRect()鏂规硶缁樺埗浜嗕竴涓煩褰紝杩欎釜鐭╁舰涔熷氨鍙互褰撲綔鏄疌ounterView鐨勮儗鏅浘鍚с€傛帴鐫€灏嗙敾绗旇缃负榛勮壊锛屽噯澶囧湪鑳屾櫙涓婇潰缁樺埗褰撳墠鐨勮鏁帮紝娉ㄦ剰杩欓噷鍏堟槸璋冪敤浜唃etTextBounds()鏂规硶鏉ヨ幏鍙栧埌鏂囧瓧鐨勫搴﹀拰楂樺害锛岀劧鍚庤皟鐢ㄤ簡drawText()鏂规硶鍘昏繘琛岀粯鍒跺氨鍙互浜嗐€?/p>
杩欐牱锛屼竴涓嚜瀹氫箟鐨刅iew灏卞凡缁忓畬鎴愪簡锛屽苟涓旂洰鍓嶈繖涓狢ounterView鏄叿澶囪嚜鍔ㄨ鏁板姛鑳界殑銆傞偅涔堝墿涓嬬殑闂灏辨槸濡備綍璁╄繖涓猇iew鍦ㄧ晫闈笂鏄剧ず鍑烘潵浜嗭紝鍏跺疄杩欎篃闈炲父绠€鍗曪紝鎴戜滑鍙渶瑕佸儚浣跨敤鏅€氱殑鎺т欢涓€鏍锋潵浣跨敤CounterView灏卞彲浠ヤ簡銆傛瘮濡傚湪甯冨眬鏂囦欢涓姞鍏ュ涓嬩唬鐮侊細
- <RelativeLayout聽xmlns:android="http://schemas.android.com/apk/res/android"聽聽
- 聽聽聽聽android:layout_width="match_parent"聽聽
- 聽聽聽聽android:layout_height="match_parent"聽>聽聽
- 聽聽
- 聽聽聽聽<com.example.customview.CounterView聽聽
- 聽聽聽聽聽聽聽聽android:layout_width="100dp"聽聽
- 聽聽聽聽聽聽聽聽android:layout_height="100dp"聽聽
- 聽聽聽聽聽聽聽聽android:layout_centerInParent="true"聽/>聽聽
- 聽聽
- </RelativeLayout>聽聽
鍙互鐪嬪埌锛岃繖閲屾垜浠皢CounterView鏀惧叆浜嗕竴涓猂elativeLayout涓紝鐒跺悗鍙互鍍忎娇鐢ㄦ櫘閫氭帶浠舵潵缁機ounterView鎸囧畾鍚勭灞炴€э紝姣斿閫氳繃layout_width鍜宭ayout_height鏉ユ寚瀹欳ounterView鐨勫楂橈紝閫氳繃android:layout_centerInParent鏉ユ寚瀹氬畠鍦ㄥ竷灞€閲屽眳涓樉绀恒€傚彧涓嶈繃闇€瑕佹敞鎰忥紝鑷畾涔夌殑View鍦ㄤ娇鐢ㄧ殑鏃跺€欎竴瀹氳鍐欏嚭瀹屾暣鐨勫寘鍚嶏紝涓嶇劧绯荤粺灏嗘棤娉曟壘鍒拌繖涓猇iew銆?/span>
聽
濂戒簡锛屽氨鏄繖涔堢畝鍗曪紝鎺ヤ笅鏉ユ垜浠彲浠ヨ繍琛屼竴涓嬬▼搴忥紝骞朵笉鍋滃湴鐐瑰嚮CounterView锛屾晥鏋滃涓嬪浘鎵€绀恒€?/p>

鎬庝箞鏍凤紵鏄笉鏄劅瑙夎嚜瀹氫箟View涔熷苟涓嶆槸浠€涔堥珮绾х殑鎶€鏈紝绠€鍗曞嚑琛屼唬鐮佸氨鍙互瀹炵幇浜嗐€傚綋鐒朵簡锛岃繖涓狢ounterView鍔熻兘闈炲父绠€闄嬶紝鍙湁涓€涓鏁板姛鑳斤紝鍥犳鍙渶鍑犺浠g爜灏辫冻澶熶簡锛屽綋浣犻渶瑕佺粯鍒舵瘮杈冨鏉傜殑View鏃讹紝杩樻槸闇€瑕佸緢澶氭妧宸х殑銆?/p>
浜屻€佺粍鍚堟帶浠?/strong>
缁勫悎鎺т欢鐨勬剰鎬濆氨鏄紝鎴戜滑骞朵笉闇€瑕佽嚜宸卞幓缁樺埗瑙嗗浘涓婃樉绀虹殑鍐呭锛岃€屽彧鏄敤绯荤粺鍘熺敓鐨勬帶浠跺氨濂戒簡锛屼絾鎴戜滑鍙互灏嗗嚑涓郴缁熷師鐢熺殑鎺т欢缁勫悎鍒颁竴璧凤紝杩欐牱鍒涘缓鍑虹殑鎺т欢灏辫绉颁负缁勫悎鎺т欢銆?/p>
涓句釜渚嬪瓙鏉ヨ锛屾爣棰樻爮灏辨槸涓緢甯歌鐨勭粍鍚堟帶浠讹紝寰堝鐣岄潰鐨勫ご閮ㄩ兘浼氭斁缃竴涓爣棰樻爮锛屾爣棰樻爮涓婁細鏈変釜杩斿洖鎸夐挳鍜屾爣棰橈紝鐐瑰嚮鎸夐挳鍚庡氨鍙互杩斿洖鍒颁笂涓€涓晫闈€傞偅涔堜笅闈㈡垜浠氨鏉ュ皾璇曞幓瀹炵幇杩欐牱涓€涓爣棰樻爮鎺т欢銆?/p>
鏂板缓涓€涓猼itle.xml甯冨眬鏂囦欢锛屼唬鐮佸涓嬫墍绀猴細
- <?xml聽version="1.0"聽encoding="utf-8"?>聽聽
- <RelativeLayout聽xmlns:android="http://schemas.android.com/apk/res/android"聽聽
- 聽聽聽聽android:layout_width="match_parent"聽聽
- 聽聽聽聽android:layout_height="50dp"聽聽
- 聽聽聽聽android:background="#ffcb05"聽>聽聽
- 聽聽
- 聽聽聽聽<Button聽聽
- 聽聽聽聽聽聽聽聽android:id="@+id/button_left"聽聽
- 聽聽聽聽聽聽聽聽android:layout_width="60dp"聽聽
- 聽聽聽聽聽聽聽聽android:layout_height="40dp"聽聽
- 聽聽聽聽聽聽聽聽android:layout_centerVertical="true"聽聽
- 聽聽聽聽聽聽聽聽android:layout_marginLeft="5dp"聽聽
- 聽聽聽聽聽聽聽聽android:background="@drawable/back_button"聽聽
- 聽聽聽聽聽聽聽聽android:text="Back"聽聽
- 聽聽聽聽聽聽聽聽android:textColor="#fff"聽/>聽聽
- 聽聽
- 聽聽聽聽<TextView聽聽
- 聽聽聽聽聽聽聽聽android:id="@+id/title_text"聽聽
- 聽聽聽聽聽聽聽聽android:layout_width="wrap_content"聽聽
- 聽聽聽聽聽聽聽聽android:layout_height="wrap_content"聽聽
- 聽聽聽聽聽聽聽聽android:layout_centerInParent="true"聽聽
- 聽聽聽聽聽聽聽聽android:text="This聽is聽Title"聽聽
- 聽聽聽聽聽聽聽聽android:textColor="#fff"聽聽
- 聽聽聽聽聽聽聽聽android:textSize="20sp"聽/>聽聽
- 聽聽
- </RelativeLayout>聽聽
鍦ㄨ繖涓竷灞€鏂囦欢涓紝鎴戜滑棣栧厛瀹氫箟浜嗕竴涓猂elativeLayout浣滀负鑳屾櫙甯冨眬锛岀劧鍚庡湪杩欎釜甯冨眬閲屽畾涔変簡涓€涓狟utton鍜屼竴涓猅extView锛孊utton灏辨槸鏍囬鏍忎腑鐨勮繑鍥炴寜閽紝TextView灏辨槸鏍囬鏍忎腑鐨勬樉绀虹殑鏂囧瓧銆?/p>
鎺ヤ笅鏉ュ垱寤轰竴涓猅itleView缁ф壙鑷狥rameLayout锛屼唬鐮佸涓嬫墍绀猴細
聽
- public聽class聽TitleView聽extends聽FrameLayout聽{聽聽
- 聽聽
- 聽聽聽聽private聽Button聽leftButton;聽聽
- 聽聽
- 聽聽聽聽private聽TextView聽titleText;聽聽
- 聽聽
- 聽聽聽聽public聽TitleView(Context聽context,聽AttributeSet聽attrs)聽{聽聽
- 聽聽聽聽聽聽聽聽super(context,聽attrs);聽聽
- 聽聽聽聽聽聽聽聽LayoutInflater.from(context).inflate(R.layout.title,聽this);聽聽
- 聽聽聽聽聽聽聽聽titleText聽=聽(TextView)聽findViewById(R.id.title_text);聽聽
- 聽聽聽聽聽聽聽聽leftButton聽=聽(Button)聽findViewById(R.id.button_left);聽聽
- 聽聽聽聽聽聽聽聽leftButton.setOnClickListener(new聽OnClickListener()聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽@Override聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽public聽void聽onClick(View聽v)聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽((Activity)聽getContext()).finish();聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽}聽聽
- 聽聽聽聽聽聽聽聽});聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽public聽void聽setTitleText(String聽text)聽{聽聽
- 聽聽聽聽聽聽聽聽titleText.setText(text);聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽public聽void聽setLeftButtonText(String聽text)聽{聽聽
- 聽聽聽聽聽聽聽聽leftButton.setText(text);聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽public聽void聽setLeftButtonListener(OnClickListener聽l)聽{聽聽
- 聽聽聽聽聽聽聽聽leftButton.setOnClickListener(l);聽聽
- 聽聽聽聽}聽聽
- 聽聽
- }聽聽
TitleView涓殑浠g爜闈炲父绠€鍗曪紝鍦═itleView鐨勬瀯寤烘柟娉曚腑锛屾垜浠皟鐢ㄤ簡LayoutInflater鐨刬nflate()鏂规硶鏉ュ姞杞藉垰鍒氬畾涔夌殑title.xml甯冨眬锛岃繖閮ㄥ垎鍐呭鎴戜滑宸茬粡鍦?/span>Android LayoutInflater鍘熺悊鍒嗘瀽锛屽甫浣犱竴姝ユ娣卞叆浜嗚ВView(涓€)聽杩欑瘒鏂囩珷涓涔犺繃浜嗐€?/span>
聽
鎺ヤ笅鏉ヨ皟鐢╢indViewById()鏂规硶鑾峰彇鍒颁簡杩斿洖鎸夐挳鐨勫疄渚嬶紝鐒跺悗鍦ㄥ畠鐨刼nClick浜嬩欢涓皟鐢╢inish()鏂规硶鏉ュ叧闂綋鍓嶇殑Activity锛屼篃灏辩浉褰撲簬瀹炵幇杩斿洖鍔熻兘浜嗐€?/p>
鍙﹀锛屼负浜嗚TitleView鏈夋洿寮哄湴鎵╁睍鎬э紝鎴戜滑杩樻彁渚涗簡setTitleText()銆乻etLeftButtonText()銆乻etLeftButtonListener()绛夋柟娉曪紝鍒嗗埆鐢ㄤ簬璁剧疆鏍囬鏍忎笂鐨勬枃瀛椼€佽繑鍥炴寜閽笂鐨勬枃瀛椼€佷互鍙婅繑鍥炴寜閽殑鐐瑰嚮浜嬩欢銆?/p>
鍒颁簡杩欓噷锛屼竴涓嚜瀹氫箟鐨勬爣棰樻爮灏卞畬鎴愪簡锛岄偅涔堜笅闈㈠張鍒颁簡濡備綍寮曠敤杩欎釜鑷畾涔塚iew鐨勯儴鍒嗭紝鍏跺疄鏂规硶鍩烘湰閮芥槸鐩稿悓鐨勶紝鍦ㄥ竷灞€鏂囦欢涓坊鍔犲涓嬩唬鐮侊細
- <RelativeLayout聽xmlns:android="http://schemas.android.com/apk/res/android"聽聽
- 聽聽聽聽xmlns:tools="http://schemas.android.com/tools"聽聽
- 聽聽聽聽android:layout_width="match_parent"聽聽
- 聽聽聽聽android:layout_height="match_parent"聽>聽聽
- 聽聽
- 聽聽聽聽<com.example.customview.TitleView聽聽
- 聽聽聽聽聽聽聽聽android:id="@+id/title_view"聽聽
- 聽聽聽聽聽聽聽聽android:layout_width="match_parent"聽聽
- 聽聽聽聽聽聽聽聽android:layout_height="wrap_content"聽>聽聽
- 聽聽聽聽</com.example.customview.TitleView>聽聽
- 聽聽
- </RelativeLayout>聽聽
聽
杩欐牱灏辨垚鍔熷皢涓€涓爣棰樻爮鎺т欢寮曞叆鍒板竷灞€鏂囦欢涓簡锛岃繍琛屼竴涓嬬▼搴忥紝鏁堟灉濡備笅鍥炬墍绀猴細

鐜板湪鐐瑰嚮涓€涓婤ack鎸夐挳锛屽氨鍙互鍏抽棴褰撳墠鐨凙ctivity浜嗐€傚鏋滀綘鎯宠淇敼鏍囬鏍忎笂鏄剧ず鐨勫唴瀹癸紝鎴栬€呰繑鍥炴寜閽殑榛樿浜嬩欢锛屽彧闇€瑕佸湪Activity涓€氳繃findViewById()鏂规硶寰楀埌TitleView鐨勫疄渚嬶紝鐒跺悗璋冪敤setTitleText()銆乻etLeftButtonText()銆乻etLeftButtonListener()绛夋柟娉曡繘琛岃缃氨OK浜嗐€?/p>
聽
涓夈€佺户鎵挎帶浠?/span>
聽
缁ф壙鎺т欢鐨勬剰鎬濆氨鏄紝鎴戜滑骞朵笉闇€瑕佽嚜宸遍噸澶村幓瀹炵幇涓€涓帶浠讹紝鍙渶瑕佸幓缁ф壙涓€涓幇鏈夌殑鎺т欢锛岀劧鍚庡湪杩欎釜鎺т欢涓婂鍔犱竴浜涙柊鐨勫姛鑳斤紝灏卞彲浠ュ舰鎴愪竴涓嚜瀹氫箟鐨勬帶浠朵簡銆傝繖绉嶈嚜瀹氫箟鎺т欢鐨勭壒鐐瑰氨鏄笉浠呰兘澶熸寜鐓ф垜浠殑闇€姹傚姞鍏ョ浉搴旂殑鍔熻兘锛岃繕鍙互淇濈暀鍘熺敓鎺т欢鐨勬墍鏈夊姛鑳斤紝姣斿聽Android PowerImageView瀹炵幇锛屽彲浠ユ挱鏀惧姩鐢荤殑寮哄ぇImageView聽杩欑瘒鏂囩珷涓粙缁嶇殑PowerImageView灏辨槸涓€涓吀鍨嬬殑缁ф壙鎺т欢銆?/p>
涓轰簡鑳藉鍔犳繁澶у瀵硅繖绉嶈嚜瀹氫箟View鏂瑰紡鐨勭悊瑙o紝涓嬮潰鎴戜滑鍐嶆潵缂栧啓涓€涓柊鐨勭户鎵挎帶浠躲€侺istView鐩镐俊姣忎竴涓狝ndroid绋嬪簭鍛橀兘涓€瀹氫娇鐢ㄨ繃锛岃繖娆℃垜浠噯澶囧ListView杩涜鎵╁睍锛屽姞鍏ュ湪ListView涓婃粦鍔ㄥ氨鍙互鏄剧ず鍑轰竴涓垹闄ゆ寜閽紝鐐瑰嚮鎸夐挳灏变細鍒犻櫎鐩稿簲鏁版嵁鐨勫姛鑳姐€?/p>
棣栧厛闇€瑕佸噯澶囦竴涓垹闄ゆ寜閽殑甯冨眬锛屾柊寤篸elete_button.xml鏂囦欢锛屼唬鐮佸涓嬫墍绀猴細
- <?xml聽version="1.0"聽encoding="utf-8"?>聽聽
- <Button聽xmlns:android="http://schemas.android.com/apk/res/android"聽聽
- 聽聽聽聽android:id="@+id/delete_button"聽聽
- 聽聽聽聽android:layout_width="wrap_content"聽聽
- 聽聽聽聽android:layout_height="wrap_content"聽聽
- 聽聽聽聽android:background="@drawable/delete_button"聽>聽聽
- 聽聽
- </Button>聽聽
杩欎釜甯冨眬鏂囦欢寰堢畝鍗曪紝鍙湁涓€涓寜閽€屽凡锛屽苟涓旀垜浠粰杩欎釜鎸夐挳鎸囧畾浜嗕竴寮犲垹闄よ儗鏅浘銆?/span>
聽
鎺ョ潃鍒涘缓MyListView缁ф壙鑷狶istView锛岃繖灏辨槸鎴戜滑鑷畾涔夌殑View浜嗭紝浠g爜濡備笅鎵€绀猴細
- public聽class聽MyListView聽extends聽ListView聽implements聽OnTouchListener,聽聽
- 聽聽聽聽聽聽聽聽OnGestureListener聽{聽聽
- 聽聽
- 聽聽聽聽private聽GestureDetector聽gestureDetector;聽聽
- 聽聽
- 聽聽聽聽private聽OnDeleteListener聽listener;聽聽
- 聽聽
- 聽聽聽聽private聽View聽deleteButton;聽聽
- 聽聽
- 聽聽聽聽private聽ViewGroup聽itemLayout;聽聽
- 聽聽
- 聽聽聽聽private聽int聽selectedItem;聽聽
- 聽聽
- 聽聽聽聽private聽boolean聽isDeleteShown;聽聽
- 聽聽
- 聽聽聽聽public聽MyListView(Context聽context,聽AttributeSet聽attrs)聽{聽聽
- 聽聽聽聽聽聽聽聽super(context,聽attrs);聽聽
- 聽聽聽聽聽聽聽聽gestureDetector聽=聽new聽GestureDetector(getContext(),聽this);聽聽
- 聽聽聽聽聽聽聽聽setOnTouchListener(this);聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽public聽void聽setOnDeleteListener(OnDeleteListener聽l)聽{聽聽
- 聽聽聽聽聽聽聽聽listener聽=聽l;聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽boolean聽onTouch(View聽v,聽MotionEvent聽event)聽{聽聽
- 聽聽聽聽聽聽聽聽if聽(isDeleteShown)聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽itemLayout.removeView(deleteButton);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽deleteButton聽=聽null;聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽isDeleteShown聽=聽false;聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽return聽false;聽聽
- 聽聽聽聽聽聽聽聽}聽else聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽return聽gestureDetector.onTouchEvent(event);聽聽
- 聽聽聽聽聽聽聽聽}聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽boolean聽onDown(MotionEvent聽e)聽{聽聽
- 聽聽聽聽聽聽聽聽if聽(!isDeleteShown)聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽selectedItem聽=聽pointToPosition((int)聽e.getX(),聽(int)聽e.getY());聽聽
- 聽聽聽聽聽聽聽聽}聽聽
- 聽聽聽聽聽聽聽聽return聽false;聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽boolean聽onFling(MotionEvent聽e1,聽MotionEvent聽e2,聽float聽velocityX,聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽float聽velocityY)聽{聽聽
- 聽聽聽聽聽聽聽聽if聽(!isDeleteShown聽&&聽Math.abs(velocityX)聽>聽Math.abs(velocityY))聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽deleteButton聽=聽LayoutInflater.from(getContext()).inflate(聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽R.layout.delete_button,聽null);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽deleteButton.setOnClickListener(new聽OnClickListener()聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽@Override聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽public聽void聽onClick(View聽v)聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽itemLayout.removeView(deleteButton);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽deleteButton聽=聽null;聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽isDeleteShown聽=聽false;聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽listener.onDelete(selectedItem);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽});聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽itemLayout聽=聽(ViewGroup)聽getChildAt(selectedItem聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽-聽getFirstVisiblePosition());聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽RelativeLayout.LayoutParams聽params聽=聽new聽RelativeLayout.LayoutParams(聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽LayoutParams.WRAP_CONTENT,聽LayoutParams.WRAP_CONTENT);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽params.addRule(RelativeLayout.CENTER_VERTICAL);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽itemLayout.addView(deleteButton,聽params);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽isDeleteShown聽=聽true;聽聽
- 聽聽聽聽聽聽聽聽}聽聽
- 聽聽聽聽聽聽聽聽return聽false;聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽boolean聽onSingleTapUp(MotionEvent聽e)聽{聽聽
- 聽聽聽聽聽聽聽聽return聽false;聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽void聽onShowPress(MotionEvent聽e)聽{聽聽
- 聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽boolean聽onScroll(MotionEvent聽e1,聽MotionEvent聽e2,聽float聽distanceX,聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽float聽distanceY)聽{聽聽
- 聽聽聽聽聽聽聽聽return聽false;聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽void聽onLongPress(MotionEvent聽e)聽{聽聽
- 聽聽聽聽}聽聽
- 聽聽聽聽聽聽
- 聽聽聽聽public聽interface聽OnDeleteListener聽{聽聽
- 聽聽
- 聽聽聽聽聽聽聽聽void聽onDelete(int聽index);聽聽
- 聽聽
- 聽聽聽聽}聽聽
- 聽聽
- }聽聽
鐢变簬浠g爜閫昏緫姣旇緝绠€鍗曪紝鎴戝氨娌℃湁鍔犳敞閲娿€傝繖閲屽湪MyListView鐨勬瀯閫犳柟娉曚腑鍒涘缓浜嗕竴涓狦estureDetector鐨勫疄渚嬬敤浜庣洃鍚墜鍔匡紝鐒跺悗缁橫yListView娉ㄥ唽浜唗ouch鐩戝惉浜嬩欢銆傜劧鍚庡湪onTouch()鏂规硶涓繘琛屽垽鏂紝濡傛灉鍒犻櫎鎸夐挳宸茬粡鏄剧ず浜嗭紝灏卞皢瀹冪Щ闄ゆ帀锛屽鏋滃垹闄ゆ寜閽病鏈夋樉绀猴紝灏变娇鐢℅estureDetector鏉ュ鐞嗗綋鍓嶆墜鍔裤€?/span>
聽
褰撴墜鎸囨寜涓嬫椂锛屼細璋冪敤OnGestureListener鐨刼nDown()鏂规硶锛屽湪杩欓噷閫氳繃pointToPosition()鏂规硶鏉ュ垽鏂嚭褰撳墠閫変腑鐨勬槸ListView鐨勫摢涓€琛屻€傚綋鎵嬫寚蹇€熸粦鍔ㄦ椂锛屼細璋冪敤onFling()鏂规硶锛屽湪杩欓噷浼氬幓鍔犺浇delete_button.xml杩欎釜甯冨眬锛岀劧鍚庡皢鍒犻櫎鎸夐挳娣诲姞鍒板綋鍓嶉€変腑鐨勯偅涓€琛宨tem涓娿€傛敞鎰忥紝鎴戜滑杩樼粰鍒犻櫎鎸夐挳娣诲姞浜嗕竴涓偣鍑讳簨浠讹紝褰撶偣鍑讳簡鍒犻櫎鎸夐挳鏃跺氨浼氬洖璋僶nDeleteListener鐨刼nDelete()鏂规硶锛屽湪鍥炶皟鏂规硶涓簲璇ュ幓澶勭悊鍏蜂綋鐨勫垹闄ゆ搷浣溿€?/p>
濂戒簡锛岃嚜瀹氫箟View鐨勫姛鑳藉埌姝ゅ氨瀹屾垚浜嗭紝鎺ヤ笅鏉ユ垜浠渶瑕佺湅涓€涓嬪浣曟墠鑳戒娇鐢ㄨ繖涓嚜瀹氫箟View銆傞鍏堥渶瑕佸垱寤轰竴涓狶istView瀛愰」鐨勫竷灞€鏂囦欢锛屾柊寤簃y_list_view_item.xml锛屼唬鐮佸涓嬫墍绀猴細
- <?xml聽version="1.0"聽encoding="utf-8"?>聽聽
- <RelativeLayout聽xmlns:android="http://schemas.android.com/apk/res/android"聽聽
- 聽聽聽聽android:layout_width="match_parent"聽聽
- 聽聽聽聽android:layout_height="match_parent"聽聽
- 聽聽聽聽android:descendantFocusability="blocksDescendants"聽聽
- 聽聽聽聽android:orientation="vertical"聽>聽聽
- 聽聽
- 聽聽聽聽<TextView聽聽
- 聽聽聽聽聽聽聽聽android:id="@+id/text_view"聽聽
- 聽聽聽聽聽聽聽聽android:layout_width="wrap_content"聽聽
- 聽聽聽聽聽聽聽聽android:layout_height="50dp"聽聽
- 聽聽聽聽聽聽聽聽android:layout_centerVertical="true"聽聽
- 聽聽聽聽聽聽聽聽android:gravity="left|center_vertical"聽聽
- 聽聽聽聽聽聽聽聽android:textColor="#000"聽/>聽聽
- 聽聽
- </RelativeLayout>聽聽
鐒跺悗鍒涘缓涓€涓€傞厤鍣∕yAdapter锛屽湪杩欎釜閫傞厤鍣ㄤ腑鍘诲姞杞絤y_list_view_item甯冨眬锛屼唬鐮佸涓嬫墍绀猴細
- public聽class聽MyAdapter聽extends聽ArrayAdapter<String>聽{聽聽
- 聽聽
- 聽聽聽聽public聽MyAdapter(Context聽context,聽int聽textViewResourceId,聽List<String>聽objects)聽{聽聽
- 聽聽聽聽聽聽聽聽super(context,聽textViewResourceId,聽objects);聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽public聽View聽getView(int聽position,聽View聽convertView,聽ViewGroup聽parent)聽{聽聽
- 聽聽聽聽聽聽聽聽View聽view;聽聽
- 聽聽聽聽聽聽聽聽if聽(convertView聽==聽null)聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽view聽=聽LayoutInflater.from(getContext()).inflate(R.layout.my_list_view_item,聽null);聽聽
- 聽聽聽聽聽聽聽聽}聽else聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽view聽=聽convertView;聽聽
- 聽聽聽聽聽聽聽聽}聽聽
- 聽聽聽聽聽聽聽聽TextView聽textView聽=聽(TextView)聽view.findViewById(R.id.text_view);聽聽
- 聽聽聽聽聽聽聽聽textView.setText(getItem(position));聽聽
- 聽聽聽聽聽聽聽聽return聽view;聽聽
- 聽聽聽聽}聽聽
- 聽聽
- }聽聽
鍒拌繖閲屽氨鍩烘湰宸茬粡瀹屽伐浜嗭紝涓嬮潰鍦ㄧ▼搴忕殑涓诲竷灞€鏂囦欢閲岄潰寮曞叆MyListView杩欎釜鎺т欢锛屽涓嬫墍绀猴細
- <RelativeLayout聽xmlns:android="http://schemas.android.com/apk/res/android"聽聽
- 聽聽聽聽xmlns:tools="http://schemas.android.com/tools"聽聽
- 聽聽聽聽android:layout_width="match_parent"聽聽
- 聽聽聽聽android:layout_height="match_parent"聽>聽聽
- 聽聽
- 聽聽聽聽<com.example.customview.MyListView聽聽
- 聽聽聽聽聽聽聽聽android:id="@+id/my_list_view"聽聽
- 聽聽聽聽聽聽聽聽android:layout_width="match_parent"聽聽
- 聽聽聽聽聽聽聽聽android:layout_height="wrap_content"聽>聽聽
- 聽聽聽聽</com.example.customview.MyListView>聽聽
- 聽聽
- </RelativeLayout>聽聽
鏈€鍚庡湪Activity涓垵濮嬪寲MyListView涓殑鏁版嵁锛屽苟澶勭悊浜唎nDelete()鏂规硶鐨勫垹闄ら€昏緫锛屼唬鐮佸涓嬫墍绀猴細
- public聽class聽MainActivity聽extends聽Activity聽{聽聽
- 聽聽
- 聽聽聽聽private聽MyListView聽myListView;聽聽
- 聽聽
- 聽聽聽聽private聽MyAdapter聽adapter;聽聽
- 聽聽
- 聽聽聽聽private聽List<String>聽contentList聽=聽new聽ArrayList<String>();聽聽
- 聽聽
- 聽聽聽聽@Override聽聽
- 聽聽聽聽protected聽void聽onCreate(Bundle聽savedInstanceState)聽{聽聽
- 聽聽聽聽聽聽聽聽super.onCreate(savedInstanceState);聽聽
- 聽聽聽聽聽聽聽聽requestWindowFeature(Window.FEATURE_NO_TITLE);聽聽
- 聽聽聽聽聽聽聽聽setContentView(R.layout.activity_main);聽聽
- 聽聽聽聽聽聽聽聽initList();聽聽
- 聽聽聽聽聽聽聽聽myListView聽=聽(MyListView)聽findViewById(R.id.my_list_view);聽聽
- 聽聽聽聽聽聽聽聽myListView.setOnDeleteListener(new聽OnDeleteListener()聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽@Override聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽public聽void聽onDelete(int聽index)聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽contentList.remove(index);聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽adapter.notifyDataSetChanged();聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽}聽聽
- 聽聽聽聽聽聽聽聽});聽聽
- 聽聽聽聽聽聽聽聽adapter聽=聽new聽MyAdapter(this,聽0,聽contentList);聽聽
- 聽聽聽聽聽聽聽聽myListView.setAdapter(adapter);聽聽
- 聽聽聽聽}聽聽
- 聽聽
- 聽聽聽聽private聽void聽initList()聽{聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽1");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽2");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽3");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽4");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽5");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽6");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽7");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽8");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽9");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽10");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽11");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽12");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽13");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽14");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽15");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽16");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽17");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽18");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽19");聽聽
- 聽聽聽聽聽聽聽聽contentList.add("Content聽Item聽20");聽聽
- 聽聽聽聽}聽聽
- 聽聽
- }聽聽
杩欐牱灏辨妸鏁翠釜渚嬪瓙鐨勪唬鐮侀兘瀹屾垚浜嗭紝鐜板湪杩愯涓€涓嬬▼搴忥紝浼氱湅鍒癕yListView鍙互鍍廘istView涓€鏍凤紝姝e父鏄剧ず鎵€鏈夌殑鏁版嵁锛屼絾鏄綋浣犵敤鎵嬫寚鍦∕yListView鐨勬煇涓€琛屼笂蹇€熸粦鍔ㄦ椂锛屽氨浼氭湁涓€涓垹闄ゆ寜閽樉绀哄嚭鏉ワ紝濡備笅鍥炬墍绀猴細
鐐瑰嚮涓€涓嬪垹闄ゆ寜閽氨鍙互灏嗙6琛岀殑鏁版嵁鍒犻櫎浜嗐€傛鏃剁殑MyListView涓嶄粎淇濈暀浜哃istView鍘熺敓鐨勬墍鏈夊姛鑳斤紝杩樺鍔犱簡涓€涓粦鍔ㄨ繘琛屽垹闄ょ殑鍔熻兘锛岀‘瀹炴槸涓€涓笉鎶樹笉鎵g殑缁ф壙鎺т欢銆?/div>
鍒颁簡杩欓噷锛屾垜浠氨鎶婅嚜瀹氫箟View鐨勫嚑绉嶅疄鐜版柟娉曞叏閮ㄨ瀹屼簡锛岃櫧鐒舵瘡涓緥瀛愰兘寰堢畝鍗曪紝浣嗘槸涓囧彉涓嶇鍏跺畻锛屽鏉傜殑View涔熸槸鐢辫繖浜涚畝鍗曠殑鍘熺悊鍫嗙Н鍑烘潵鐨勩€傜粡杩囦簡鍥涚瘒鏂囩珷鐨勫涔狅紝鐩镐俊姣忎釜浜哄View鐨勭悊瑙i兘宸茬粡杈冧负娣卞叆浜嗭紝閭d箞甯︿綘涓€姝ユ娣卞叆浜嗚ВView绯诲垪鐨勬枃绔犲氨鍒版缁撴潫锛屾劅璋㈠ぇ瀹舵湁鑰愬績鐪嬪埌鏈€鍚庛€?/div>