Android无限循环轮转广告页组件实现

浏览:1950 ℃
字体:
发布时间:2013-12-17 09:37:33
来源:

新项目一个,不过又是首页广告栏组件,第三次写这个组件了。虽然也可以拷贝以前的代码整理一下完成任务,但还是打算封装一下,重构一下代码,也算是自己近段时间学习的一个检验吧。不错不错~~

先上效果图(其中第三幅图是单击后的跳转页面,也是本人的博客,做下广告哈!大笑):

///

自定义类AdGallery,继承自Gallery:

package com.wly.android.widget;import java.util.Timer;import java.util.TimerTask;import com.wly.android.widget.AdGalleryHelper.OnGallerySwitchListener;import net.tsz.afinal.FinalBitmap;import android.content.Context;import android.content.Intent;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Gallery;import android.widget.ImageView;/** * 无限滚动广告栏组件 持有自身容器布局引用,可以操作滚动指示器RadioGroup和标题TextView *  * @author wly * @date 2013-12-13 */public class AdGallery extends Gallery implements		android.widget.AdapterView.OnItemClickListener,		android.widget.AdapterView.OnItemSelectedListener, OnTouchListener {	private Context mContext;	private int mSwitchTime; // 图片切换时间	private boolean runflag = false;	private Timer mTimer; // 自动滚动的定时器	private OnGallerySwitchListener mGallerySwitchListener;	private Advertising[] mAds;	private Handler handler = new Handler() {		@Override		public void handleMessage(Message msg) {			super.handleMessage(msg);			int position = getSelectedItemPosition();			if (position >= (getCount() - 1)) {				setSelection(getCount() / 2, true); // 跳转到第二张图片,在向左滑动一张就到了第一张图片				onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);			} else {				onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);			}		}	};	public AdGallery(Context context, AttributeSet attrs, int defStyle) {		super(context, attrs, defStyle);		this.mContext = context;		mTimer = new Timer();	}	public AdGallery(Context context) {		super(context);		this.mContext = context;		mTimer = new Timer();	}	public AdGallery(Context context, AttributeSet attrs) {		super(context, attrs);		this.mContext = context;		mTimer = new Timer();	}	class ViewHolder {		ImageView imageview;	}	/**	 * 初始化配置参数	 * 	 * @param ads	 *            图片数据数组	 * @param switchTime	 *            图片切换间隔	 * @param l_margin_p	 *            图片到距离屏幕左边界距离占屏幕的"比例"	 * @param t_margin_p	 *            图片到距离屏幕上边界距离占屏幕的"比例"	 * @param w_percent	 *            图片占屏幕的宽度"比例"	 * @param h_percent	 *            图片占屏幕的高度"比例"	 */	public void init(Advertising[] ads, int switchTime,			OnGallerySwitchListener gallerySwitchListener) {		this.mSwitchTime = switchTime;		this.mGallerySwitchListener = gallerySwitchListener;		this.mAds = ads;		setAdapter(new AdAdapter());		this.setOnItemClickListener(this);		this.setOnTouchListener(this);		this.setOnItemSelectedListener(this);		this.setSoundEffectsEnabled(false);		// setSpacing(10); //不能包含spacing,否则会导致onKeyDown()失效!!!		setSelection(getCount() / 2); // 默认选中中间位置为起始位置		setFocusableInTouchMode(true);	}	class AdAdapter extends BaseAdapter {		@Override		public int getCount() {			return mAds.length * (Integer.MAX_VALUE / mAds.length);		}		@Override		public Object getItem(int position) {			return null;		}		@Override		public long getItemId(int position) {			return position;		}		@Override		public View getView(int position, View convertView, ViewGroup parent) {			ViewHolder viewHolder;			if (convertView == null) {				convertView = LayoutInflater.from(mContext).inflate(						R.layout.adgallery_image, null);				Gallery.LayoutParams params = new Gallery.LayoutParams(						Gallery.LayoutParams.FILL_PARENT,						Gallery.LayoutParams.WRAP_CONTENT);				convertView.setLayoutParams(params);				viewHolder = new ViewHolder();				viewHolder.imageview = (ImageView) convertView						.findViewById(R.id.gallery_image);				convertView.setTag(viewHolder);			} else {				viewHolder = (ViewHolder) convertView.getTag();			}			FinalBitmap.create(mContext).display(viewHolder.imageview,					mAds[position % mAds.length].getPicURL(),					viewHolder.imageview.getWidth(),					viewHolder.imageview.getHeight(), null, null);			return convertView;		}	}	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,			float velocityY) {		int kEvent;		if (isScrollingLeft(e1, e2)) { // 检查是否往左滑动			kEvent = KeyEvent.KEYCODE_DPAD_LEFT;		} else { // 检查是否往右滑动			kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;		}		onKeyDown(kEvent, null);		return true;	}	private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {		return e2.getX() > (e1.getX() + 50);	}	@Override	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,			float distanceY) {		return super.onScroll(e1, e2, distanceX, distanceY);	}	/**	 * 开始自动滚动	 */	public void startAutoScroll() {		mTimer.schedule(new TimerTask() {			public void run() {				if (runflag) {					Message msg = new Message();					if (getSelectedItemPosition() < (getCount() - 1)) {						msg.what = getSelectedItemPosition() + 1;					} else {						msg.what = 0;					}					handler.sendMessage(msg);				}			}		}, mSwitchTime, mSwitchTime);	}	public void setRunFlag(boolean flag) {		runflag = flag;	}	public boolean isAutoScrolling() {		if (mTimer == null) {			return false;		} else {			return true;		}	}	@Override	public boolean onTouch(View v, MotionEvent event) {		if (MotionEvent.ACTION_UP == event.getAction()				|| MotionEvent.ACTION_CANCEL == event.getAction()) {			// 重置自动滚动任务			setRunFlag(true);		} else {			// 停止自动滚动任务			setRunFlag(false);		}		return false;	}	@Override	public void onItemSelected(AdapterView arg0, View arg1, int position,			long arg3) {		mGallerySwitchListener.onGallerySwitch(position % (mAds.length));	}	@Override	public void onNothingSelected(AdapterView arg0) {	}	@Override	public void onItemClick(AdapterView arg0, View arg1, int position,			long arg3) {		Intent i = new Intent();		i.setClass(mContext, MyWebViewActivity.class);		i.putExtra("url", mAds[position % mAds.length].getLinkURL());		mContext.startActivity(i);	}}

以上代码核心就是用一个定时器Timer不断的发送Message个一个Handler,在Handler的handleMessage()方法中手动的切换Gallery组件,有两点需要注意:
1、gallery不能包含spacing属性,即使将该属性设置为0dp也不行,否则会导致onKeyDown()事件失效。另外不要使用setSelection(),因为使用setSelection()只是实现的切换,但没有动画效果。

2、广告栏下方标题必须指定最大长度为一个固定值,否则会在自动切换时发生抖动,这是笔者遇到的一个问题。

再对其进行一个简单的封装(添加一个标题TextView和RadioGroup),新建类AdGalleryHelper:

package com.wly.android.widget;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.view.LayoutInflater;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.RelativeLayout.LayoutParams;/** * 对自定义组件AdGallery进行了一次封装 * 包含对图片标题和当前位置指示器(RadioGroup)的操作 * @author wly * */public class AdGalleryHelper {	private AdGallery mAdGallery; //无限滚动Gallery	private TextView mPicTitle; //广告图片标题	private RadioGroup mRadioGroup; //滚动标记组件		private Context mContext;	private LayoutInflater mInflater;		RelativeLayout galleryLayout;		public AdGalleryHelper(Context context,final Advertising[] ads,int switchTime) {				this.mContext = context;		mInflater = LayoutInflater.from(context);		galleryLayout = (RelativeLayout)mInflater.inflate(R.layout.adgallery_hellper, null);		mRadioGroup = (RadioGroup)galleryLayout.findViewById(R.id.home_pop_gallery_mark);				//添加RadioButton		Bitmap b = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.point_1);		LayoutParams params = new LayoutParams(				Util.dpToPx(mContext, b.getWidth()), 				Util.dpToPx(mContext, b.getHeight()));		for (int i = 0; i < ads.length; i++) {			RadioButton _rb = new RadioButton(mContext);			_rb.setId(0x1234 + i);			_rb.setButtonDrawable(mContext.getResources().getDrawable(					R.drawable.gallery_selector));			mRadioGroup.addView(_rb, params);		}						mPicTitle = (TextView)galleryLayout.findViewById(R.id.news_gallery_text);		mAdGallery = (AdGallery)galleryLayout.findViewById(R.id.gallerypop);		mAdGallery.init(ads, switchTime,new OnGallerySwitchListener() {						@Override			public void onGallerySwitch(int position) {				if (mRadioGroup != null) {					mRadioGroup.check(mRadioGroup.getChildAt(							position).getId());				}				if(mPicTitle != null) {					mPicTitle.setText(ads[position].getTitle());				}			}		});			}		/**	 * 向外开放布局对象,使得可以将布局对象添加到外部的布局中去	 * @return	 */	public RelativeLayout getLayout() {		return galleryLayout;	}		/**	 * 开始自动循环切换	 */	public void startAutoSwitch() {		mAdGallery.setRunFlag(true);		mAdGallery.startAutoScroll();	}	public void stopAutoSwitch() {		mAdGallery.setRunFlag(true);	}		/**	 * 图片切换回调接口	 * @author wly	 *	 */	interface OnGallerySwitchListener {		public void onGallerySwitch(int position);	}}

实体类Advertising:

package com.wly.android.widget;/** * 广告实体类 * @author wly * */public class Advertising {	private String picURL; //图片地址	private String linkURL; //单击跳转地址	private String title; //标题		public Advertising(String picURL, String linkURL, String title) {		super();		this.picURL = picURL;		this.linkURL = linkURL;		this.title = title;	}		public String getPicURL() {		return picURL;	}	public void setPicURL(String picURL) {		this.picURL = picURL;	}	public String getLinkURL() {		return linkURL;	}	public void setLinkURL(String linkURL) {		this.linkURL = linkURL;	}	public String getTitle() {		return title;	}	public void setTitle(String title) {		this.title = title;	}}

Activity界面类MainActivity:

package com.wly.android.widget;import java.io.File;import net.tsz.afinal.FinalBitmap;import android.os.Bundle;import android.os.Environment;import android.app.Activity;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.Menu;import android.view.Window;import android.view.WindowManager;import android.widget.RelativeLayout;import android.widget.RelativeLayout.LayoutParams;public class MainActivity extends Activity {	RelativeLayout galleryContainer; //滚动广告组件的容器	LayoutInflater inflater;	AdGalleryHelper mGalleryHelper;		@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		getWindow().requestFeature(Window.FEATURE_NO_TITLE);		setContentView(R.layout.activity_main);		//============初始化缓存路径,以及AfinalBitmap的初始化,可以忽略		String cacheDir;		if (android.os.Environment.getExternalStorageState().equals(				android.os.Environment.MEDIA_MOUNTED)) {			File f = this.getApplicationContext().getExternalCacheDir();			if (null == f) {				cacheDir = Environment.getExternalStorageDirectory().getPath()						+ File.separator + this.getApplicationContext().getPackageName()						+ File.separator + "cache";			} else {				cacheDir = f.getPath();			}		} else {			File f = this.getApplicationContext().getCacheDir();			cacheDir = f.getPath();		}		FinalBitmap.create(this, cacheDir + File.separator				+ "images" + File.separator,				0.3f, 1024 * 1024 * 10,				 10);		//==================				//构造测试数据		Advertising ad1 = new Advertising("http://img.my.csdn.net/uploads/201312/14/1386989803_3335.PNG"				, "http://blog.csdn.net/u011638883/article/details/17302293"				, "双向搜索");		Advertising ad2 = new Advertising("http://img.my.csdn.net/uploads/201312/14/1386989613_6900.jpg"				, "http://blog.csdn.net/u011638883/article/details/17245371"				, "创意设计");		Advertising ad3 = new Advertising("http://img.my.csdn.net/uploads/201312/14/1386989802_7236.PNG"				, "http://blog.csdn.net/u011638883/article/details/17248135"				, "Artificial Intelligence");		Advertising[] ads = {ad1,ad2,ad3};				//将AdGalleryHelper添加到布局文件中		galleryContainer = (RelativeLayout) this				.findViewById(R.id.home_gallery);		mGalleryHelper = new AdGalleryHelper(this, ads, 5000);		galleryContainer.addView(mGalleryHelper.getLayout());				//开始自动切换			mGalleryHelper.startAutoSwitch(); 	}	@Override	protected void onDestroy() {		super.onDestroy();		mGalleryHelper.stopAutoSwitch();	}}

注意,代码中异步加载图片使用的Afinal框架的FinalBitmap。读者可以根据自己项目加以替换。

代码工程:http://download.csdn.net/detail/u011638883/6713923

用到的Afinal库:

好了,就这样,,

谢谢!!

闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻锝夊箣閿濆憛鎾绘煕閵堝懎顏柡灞剧洴椤㈡洟鏁愰崱娆欑喘闂備線鈧偛鑻崢鎼佹煟閹虹偛顩柟骞垮灩閳规垹鈧綆浜為ˇ鏉款渻閵堝棙灏靛┑顖e幖鍗遍柛妤冨亹閺€浠嬫煟閹邦剛鎽犵紓宥嗗灴閺屾稑顫濋澶婂壈鐎光偓閿濆懐浠㈤柍璇查叄楠炲鈹戦幇顓ф%闂傚倷鑳堕~瀣礋閸偆鏆﹂梻浣瑰▕閺€閬嶅垂閸洖桅闁告洦鍨扮粻鎶芥煕閳╁啨浠﹀瑙勬礈缁辨捇宕掑▎鎴М濡炪倧瀵岄崹鍫曘€佸棰濇晣闁绘ɑ褰冮悘濠冪節閻㈤潧校闁煎綊绠栧畷姗€鍩€椤掆偓椤啴濡堕崱妯烘殫闂佸摜濮甸幑鍥х暦閵忋倕绠瑰ù锝呭帨閹锋椽姊虹涵鍛汗闁稿鐩畷婵單旈崨顔惧幐闂佸憡渚楅崰姘垛€栨總鍛婄厓妞ゅ繐鎳忕亸锔芥叏婵犲嫮甯涢柟宄版嚇瀹曘劑妫冨☉姘毙ㄥ銈冨灪閻楃姴鐣烽崡鐐╂婵☆垳鈷堥崬鍫曟⒒娴e摜绉烘俊顐ユ硶缁牊绗熼埀顒勫箖閿熺姴鐏抽柟棰佽兌閸炵敻鏌i悩鐑橆仩閻忓繈鍔戝畷婵嬫偄閸忚偐鍘搁梺绯曟閸橀箖鎮鹃悽鍛婄厸閻忕偛澧藉ú鏉戔攽閿涘嫬鍘村┑顔瑰亾闂佹枼鏅涢崯鎷屻亹閸ヮ剚鈷掑ù锝堟鐢稓绱掔€n亞绠荤€规洘娲栭悾鐑藉炊椤垶缍楅梻浣筋潐瀹曟﹢顢氳婢规洟宕楅懖鈺冾啎闂佺硶鍓濋敋濞e浂鍨堕弻娑㈡倷閼碱剛楔濠殿喖锕ュ浠嬪蓟閸涘瓨鍊烽柤鑹版硾椤忣厽绻濋埛鈧仦鑺ョ彎闂佸搫鏈惄顖炲箖閵忋倖鐓ラ悗锝庝簷濞n喗淇婇悙顏勨偓鎴﹀垂閸濆嫀娑㈠礃椤旇 鍋撴担鍓叉建闁逞屽墴楠炲啴鍩¢崪浣规櫇濡炪値鍋掗崢濂杆夊鑸碘拺闁煎鍊曢弸鎴︽煟閻旀潙鍔ら柍褜鍓氶崙褰掑储閸撗冨灊闁割偁鍎辩粈鍐┿亜韫囨挻顥犻柨娑欑矒閺岋綁鎮╅崣澶屸敍闁诲繐绻戦悷锕傚疾閸洘鏅滅紒娑橆儐椤旀棃姊虹紒妯哄鐟滄澘鍟村鎶芥晲婢跺鍘遍梺鍐叉惈椤戝洨寮ч埀顒勬倵鐟欏嫭纾搁柛鏃€鍨块妴浣糕槈濮楀棙鍍靛銈嗗笒閸婃悂顢氭潏銊х瘈缁炬澘顦辩壕鍧楁煕鐎n偄鐏寸€规洘鍔欏浠嬵敇閻愭鍞堕梻浣虹帛閸旓箓宕滃璺虹煑闊洦绋掗悡锝夌叓閸ラ鍒板ù婊呭仦閵囧嫰鍩¢崒婊冨绩闂佸搫鏈ú婵堢不濞戙垹鍗抽柣鎰姈閻╊垶寮婚敓鐘茬劦妞ゆ帊鑳堕々鐑芥倵閿濆骸浜為柛妯圭矙濮婃椽鎮烽幍顔芥喖缂備浇顕ч崯顐︻敊韫囨挴鏀介悗锝庡亞閸橀亶姊洪崷顓炲妺闁哄被鍔戦妴鍌炴嚃閳哄啰锛滅紓鍌欑劍宀e灝煤鐎电硶鍋撳▓鍨灈闁绘牕銈搁悰顔锯偓锝庝簴閺€浠嬫煙闁缚绨界痪鐐劤閳规垶骞婇柛濠冾殕閹便劑鎮滈挊澶岋紱濠电偞鍨剁喊宥呯暦閸欏鍙忔俊鐐额嚙娴滈箖鎮楀▓鍨珮闁稿锕悰顔嘉熼懖鈺冿紲濠碘槅鍨崇划顖烆敂閻斿吋鈷掑ù锝堝Г绾爼鏌涢敐蹇曠暤妤犵偛绻橀弫鎾绘晸閿燂拷/QQ 1602007闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻锝夊箣閿濆憛鎾绘煕婵犲倹鍋ラ柡灞诲姂瀵噣宕奸悢鍛婎唶闂備胶枪椤戝棝骞愰崜褍鍨濇い鎾跺亹濡插牊淇婇婵愬殭婵炲憞鍥ㄢ拺婵炶尪顕ч獮妤呮煟閻斿弶娅婄€殿喖顭烽幃銏ゅ川婵犲嫮肖濠德板€х徊浠嬪疮椤栫儐鏁佺€广儱顦伴埛鎴︽煙閼测晛浠滈柍褜鍓氶悧鐘茬暦濠靛鍐€妞ゆ挾鍊i敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掑倻纾兼い鏃囧亹閸╋絾鎱ㄦ繝鍌涙儓閻撱倝鎮归崶銊ョ祷缂佺姴鎼—鍐Χ閸愩劌顬堥梺缁橆殕閹瑰洭鎮伴钘夌窞鐎光偓閳ь剟鎯屽▎鎰闁糕剝锚閸斻倝鏌熼钘夌仸缂佺粯绻堟慨鈧柨婵嗘閵嗘劙姊洪幐搴㈢┛缂佺姵鎸搁悾鐑藉閻樺棙妞介、鏃堝川椤忓懎顏归梻鍌欑閹诧紕鎹㈤崒婧惧亾濮樼厧澧寸€殿喖鍟块埢搴ㄥ箻鐎电ǹ骞楁繝寰锋澘鈧劙宕戦幘缈犵箚妞ゆ劧绲块幊鍥┾偓瑙勬礃濞茬喖銆侀弴銏℃櫆閻熸瑱绲剧€氳棄鈹戦悙鑸靛涧缂佹彃娼¢獮濠囧箻濞茬粯鏅┑鐘诧工閹虫劗澹曟總鍛婂仯闁搞儯鍔岀徊濠氭煃瑜滈崜娆撴倶濠靛鍋╅柣鎴f缁犳盯鏌℃径濠勪虎缂佹劖绋掔换婵嬫偨闂堟刀銏ゆ倵濮橆剙妲婚悡銈夋煙闂傚鍔嶉柍閿嬪灴閹綊宕堕敐鍌氫壕鐎规洖娲犻崑鎾寸節濮橆厾鍘撻悷婊勭矒瀹曟粓鎮㈡總澶婃闂侀潧饪垫俊鍥€呴悜鑺ュ€甸柨婵嗛娴滅偤鏌涘Ο鎸庮棄闁宠鍨块崺銉╁幢濡ゅ啩娣繝鐢靛仜椤︽澘煤濠婂牊鍤嶉梺顒€绉撮柨銈嗕繆閵堝嫯鍏岄柛姗€浜跺Λ鍛搭敃閵忊€愁槱闂佽鐡曢褔鏁冮姀鈥愁嚤閻庢稒岣块崢顏堟⒑閹肩偛鍔€闁告劕褰炵槐鏃€淇婇妶鍥ラ柛瀣☉鐓ゆい鎾亾閳ь兛绶氬顕€宕煎┑鍡氣偓鍨攽閻愬弶顥為柛銊ф暬閻涱噣宕卞☉娆屾嫽闂佺ǹ鏈悷褔藝閿曞倹鐓欑痪鏉垮船娴滀即鏌熼姘拱鐎垫澘瀚禒锕傚箚瑜嶇花銉︾節閻㈤潧鈻堟繛浣冲吘娑樷槈閵忕姵杈堥梺鎸庢礀閸婂綊鎮″▎鎾寸厽闁瑰浼濋鍫熷€剁€广儱顦伴悡鏇熴亜閹伴潧浜楅梺顓у灡椤ㄣ儵鎮欑€电ǹ鈪归柤鎸庡姈閵囧嫰骞掗崱妞惧闂備浇顕уù姘椤忓牆钃熼柨鐔哄Т楠炪垺绻涢崱妤冪缂侇喖鐖煎铏光偓鍦濞兼劙鏌涢妸銉﹀仴妤犵偛鍟埢搴ょ疀閿濆懏娅婃俊鐐€栭弻銊╁触鐎n噮鏁婄€广儱鎳夐弨浠嬫煟濡澧柛鐔风箻閺屾盯鎮╅幇浣圭杹濡ょ姷鍋為崝娆撶嵁鎼淬劍瀵犲璺虹灱閺嗩偊鏌i悢鍝ョ煁婵☆偄鍟撮幃浼搭敊閸㈠鍠栧畷妤呮偂鎼达絽閰遍梻鍌欐祰閸嬫劙鍩涢崼銉ョ婵炴垯鍨瑰Ч鎻捗归悡搴f憼闁抽攱甯掗湁闁挎繂鎳忛崯鐐烘煕閻斿搫浠︾紒缁樼〒閹风姾顦撮柣锝囨暩閳ь剝顫夊ú鏍礊婵犲洤钃熼柛鈩冾殢閸氬鏌涘☉鍗炵伈缂侀亶浜跺缁樻媴閸涘﹤鏆堝┑鐐额嚋缁犳挸鐣疯ぐ鎺撶劶鐎广儱妫楁禍妤呮⒑閹稿海绠撴い锕備憾瀹曪綁骞樼紒妯煎幈闂侀潧顧€缁茶姤淇婃禒瀣€堕煫鍥ч瀹撳棝鏌熼鑲╃Ш妤犵偛娲畷婊勬媴閾忚顫岄梺璇插椤旀牠宕抽鈧畷鎴炵節閸屾粍娈炬繝闈涘€绘灙閸烆垶姊洪幐搴㈩梿妞ゎ偄顦遍埀顒佷亢濡嫰鍩為幋锔藉€烽悗娑櫭棄宥夋⒑缁洘娅呴柛鐔告綑閻g兘骞嬮敃鈧粻濠氭倵闂堟稒鎲告い鏃€娲樼换娑欐綇閸撗冨煂闂佸摜鍠庡ḿ鈥崇暦閵夈儙鐔烘偘閳╁喚娼旀繝纰樻閸ㄨ京鍒掑鍛傛盯宕橀妸褎娈惧銈呯箰閹冲繑鍒婇幘顔藉仭婵炲棗绻愰顏堟煟濠靛浂娈滄慨濠傤煼瀹曟帒鈻庨幋顓熜滈梻浣筋潐缁佹挳宕滃┑鍫㈢當闁绘棁鍋ら弮鍫濆窛妞ゆ挾濮峰畷鑸电節濞堝灝鏋熼弸顏嗙磽閸粌宓嗛柛鈹惧亾濡炪倖宸婚崑鎾绘煙閾忣個顏堫敋閿濆棛绡€婵﹩鍎甸妸鈺傜叆闁哄啠鍋撻柛搴㈠▕閻涱噣骞囬悧鍫氭嫽婵炶揪缍€椤宕戦悩缁樼厱閹兼惌鍠栧▍宥団偓娈垮枟瑜板啴鍩ユ径鎰潊闁绘ɑ褰冨▓銈夋⒒娴e憡鎯堥柛鐕佸亰閹勭節閸ャ劌浜楅梺鍛婂姦閸犳鎮¢悢鍏肩厽闁哄啫浼嬭ぐ鎹ゅ鈧綆鍠栭弸渚€鏌涢鐘插姕闁抽攱鍨块弻娑樷攽閸℃浼傞柣搴㈢婢瑰棛妲愰幒鎾崇窞閹兼惌鍠楃紞鍫熺箾閿濆懏鎼愰柨鏇ㄤ邯楠炲啫饪伴崼鐔风檮婵犮垹鍘滈弬鍌炲礉閹达箑钃熼柡鍥╁枎缁剁偞绻涢幋娆忕仾妞ゅ骸绉瑰鐑樺濞嗘帩鍚呯紓鍌氱С缁舵艾顕f繝姘櫜濠㈣泛顑呮禍婊堟⒑閸涘﹦缂氶柛搴㈠▕閹剝鎷呯化鏇熸杸闂佺粯锕╅崰鏍倶椤忓牊鐓ユ慨妯垮煐閹虫岸鏌i幇顔剧瘈缂佽妫濋弻鏇㈠醇濠靛洤娅ら梺闈╃秬濞咃絿妲愰幒妤佸亹闁告劕寮剁拠鐐测攽椤旂》鍔熺紒顕呭灦楠炲繘宕ㄩ弶鎴濈獩闂傚倸鐗婄粙鎺旀嫻閿熺姵鐓欐鐐茬仢閻忓弶顨ラ悙鏉戠瑨閾绘牠鏌嶈閸撶喖骞冮敓鐘插嵆闁靛骏绱曢崢鍗烆渻閵堝棗濮х紒鍙夊娣囧﹪宕堕浣哄幐闁诲函缍嗛崑鍛此夐崼銉︾厸鐎光偓鐎n剛鐦堥悗瑙勬礃閿曘垺淇婇幖浣肝ㄩ柕蹇曞С婢规洟鎮峰⿰鍛暭閻㈩垱甯炵划锝呂旈崨顔惧幍闂佽顔栭崰鏍€傛總鍛婄厱閻庯絻鍔屾俊浠嬫煏閸パ冾伃鐎殿喕绮欓幃浠嬫濞戞ḿ鍘掗梻鍌欑閹碱偊顢栭崶顒€绐楅柡宥庡幖缁犳牗淇婇妶鍌氫壕濡炪値鍋呯换鍫ュ箖濞嗘搩鏁嗛柍褜鍓熼、鏃堟晸閿燂拷
>更多相关文章
24小时热门资讯
24小时回复排行
闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧湱鈧懓瀚崳纾嬨亹閹烘垹鍊炲銈嗗笒椤︿即寮查鍫熷仭婵犲﹤鍟扮粻濠氭煕閳规儳浜炬俊鐐€栫敮濠囨嚄閸洖鐓濋柟鍓х帛閻撴盯鏌涘☉鍗炴灓闁活厼鐬肩槐鎺楊敋閸涱厼绫嶉梺璇″枔閸ㄤ粙骞婇弽顓熷€绘俊顖涙た濡啴姊虹化鏇熸澒闁稿鎸搁—鍐Χ閸℃鐟ㄩ梺鍝ュУ瀹€绋款嚕閾忣偄顕遍悗娑櫱氶幏娲煟閻樺弶澶勭憸鏉垮暣椤㈡濮€閵堝棛鍘遍梺褰掑亰閸擄箓鎮¢崗纰辨闁绘劘灏欑粻濠氭煛娴h宕岄柡浣规崌閺佹捇鏁撻敓锟� 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簼閹癸綁鏌i鐐搭棞闂囧鏌ㄥ┑鍡欏妞ゅ繒濮风槐鎺楀焵椤掍胶绡€闁稿本顨嗛弬鈧梻浣虹帛钃辩憸鏉垮暣閸┾偓妞ゆ巻鍋撴い鏇ㄥ幘濡叉劙骞橀幇浣瑰兊闁哄鐗勯崝宀勫几閹达附鈷戠痪顓炴噺瑜把呯磼閻樺啿鐏︽い銏狅躬濮婄粯鎷呯粵瀣秷婵犮垻鎳撳Λ娆撳疾鐠轰綍鏃堝川椤撶媴绱梻浣虹帛閸ㄥ吋鎱ㄩ妶澶嬪亗闁绘柨鍚嬮悡蹇涚叓閸パ屽剰闁诲浚浜弻锟犲幢韫囨梹鐝氶梺鍝勭焿缂嶄線寮幇鏉垮窛妞ゆ牗姘ㄩ崢鑺ョ節濞堝灝鏋涢柨鏇樺劚椤啴鎸婃竟鈺傜洴瀹曟﹢濡搁姀鈽嗘綌婵犳鍠楁灙濞存粠鍓熷鑸电鐎n偀鎷绘繛杈剧到閹虫瑨銇愰幒鎾存珖闂侀潧顦崕宥吤洪鍕敤濡炪倖甯掗崐椋庣磾閺囩偐鏀介柣妯活問閺嗩垱淇婇幓鎺撳殗鐎规洖缍婇幃鐣岀矙鐠侯煉绱遍梻浣哥秺閸嬪﹪宕曢棃娑掓闁靛繆鏅滈弲顒€鈹戦悙鏉戠仸闁绘姊婚懞杈ㄧ節濮橆厸鎷洪柣鐔哥懃鐎氼剛绮堥崘鈺冪濠㈣泛顑囬埊鏇犵磼閸屾稑娴柡浣稿暣瀹曟帒鈽夊顒€绠為梻鍌欑劍鐎笛呮崲閸岀偛绠犻煫鍥ㄧ☉缁犵喖鏌涘┑鍕姢缁炬儳銈稿鍫曞醇濞戞ê顬堝┑鐐存儗閸犳濡甸崟顖氼潊闁挎稑瀚崳浼存⒑閻熸壆锛嶉柛瀣ㄥ€栨穱濠囨倻閽樺)銊ф喐濠靛牊顫曢柨鏇炲€归埛鎺楁煕鐏炲墽鎳呮い锔肩畵閺岀喓鍠婇崡鐐板枈闂佽鍨伴張顒€顕ラ崟顐ゆ殕闁逞屽墰缁牊绻濋崒妯峰亾閹烘埈娼╅柨婵嗘噸婢规洟鏌f惔銈庢綈婵炲弶锚椤啯绂掔€n亝鐎悗骞垮劚椤︻垳绮堢€n喗鐓忓┑鐐茬仢閸旀瑥顭跨憴鍕婵﹥妞介獮鎰償閿濆洨鏆ゅ┑掳鍊楁慨鎾箟閿涘嫮鐭夌€广儱鎳夐崼顏堟煕閺囨娅冪紒銊ヮ煼濡懘顢曢姀鈥冲亶闂佺ǹ姘︾亸娆撳焵椤掍胶鍟查柟鍑ゆ嫹
闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簼閹癸綁鏌i鐐搭棞闁靛棙甯掗~婵嬫晲閸涱剙顥氬┑掳鍊楁慨鐑藉磻濞戔懞鍥偨缁嬪灝鐎俊銈忕到閸燁偆绮诲☉妯忓綊鏁愰崨顔跨缂備礁顑勭粈渚€鍩為幋锔藉亹闁割煈鍋呭В鍕節濞堝灝鏋ら柡浣割煼楠炲﹤鈹戠€n亞顦悷婊冪Ч钘熸慨姗嗗厴閺€浠嬫煟濡櫣锛嶆い锝嗙叀閺岋綁骞樼捄鐑樼亪闂佸搫鐭夌换婵嗙暦濮椻偓婵℃悂濡烽姀鐘卞闂佸憡绺块崕鏌ュ汲濠婂牊鐓曢柟鎹愬蔼閸忓瞼鐥幆褋鍋㈤柡宀嬬到铻i柧蹇曟缁辩偞绻濋埛鈧仦濂稿仐闂佸搫鑻粔鍫曞箟閹绢喖绀嬫い鎰╁€撶槐婵嬫⒒娴g瓔鍤冮柛鐘冲浮瀵煡鎮╅懡銈呯ウ闂佽宕橀褏绮婚幎鑺ョ厵闁绘劦鍓氶崕妤呮煕閻愭潙绲婚柍瑙勫灴閺佸秹宕熼鈩冩線闂備胶枪閿曘儵鎮ч弴鐘插疾婵犵數濞€濞佳兠洪姀锛勵浄闁割偁鍎查悡娆撴⒒閸屾凹鍤熸い锔煎缁辨帡鎮╅棃娑楁闂佸搫鏈ú妯兼崲濞戙垹鍨傛い鏃傚帶鑲栧┑鐘垫暩閸嬬喖顢栭弴銏犵闁硅揪绠戦拑鐔哥箾閹存瑥鐏╅柣鎺撴そ閺屾盯骞囬闂村闂佷紮缍€濞夋盯鈥旈崘顔嘉ч幖绮光偓鑼跺焻濠电偛鐡ㄧ划鐘崇濠婂牞缍栭煫鍥ㄦ媼濞差亶鏁傞柛鏇ㄤ簽閻愬﹪姊绘笟鈧ḿ褔藝椤撱垹纾挎繛宸簻閻掑灚銇勯幒宥囧妽鐎规洖鐭傞弻鈥崇暆閳ь剟宕伴弽褏鏆︽繛鍡樻尭鍥撮梺绯曞墲椤ㄥ繑瀵奸敓锟� 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧湱鈧懓瀚崳纾嬨亹閹烘垹鍊炲銈嗗笒椤︿即寮查鍫熷仭婵犲﹤鍟扮粻濠氭煕閳规儳浜炬俊鐐€栫敮濠囨嚄閸洖鐓濋柟鍓х帛閻撴盯鏌涘☉鍗炵仩鐎涙繈姊烘导娆戝埌闁搞垼灏悘鎺楁⒑閻撳寒娼熼柛濠冾殜閹線宕煎┑鍐╂杸濡炪倖姊归弸缁樼瑹濞戙垺鐓曟俊顖滅帛閸婃劖顨ラ悙鏉戝鐎规洘锕㈤、娆戞喆閿濆棗顏归梻鍌欑閹诧紕绮欓幋锔芥櫇闁靛绠戠欢鐐烘煕閺囥劌鐏¢柣鎾存礋閻擃偊宕堕妸锔规嫽闂侀潧妫欑敮锟犲蓟閻旇偐宓侀柛顭戝枤娴煎牓鎮楃憴鍕鐎规洦鍓熼崺銏℃償閵娿儳鐤€濡炪倖甯婇懗鍫曞焵椤掑嫮鐣烘慨濠勭帛閹峰懘宕ㄦ繝鍐ㄥ壍闂備胶枪閿曘倗绱炴繝鍥モ偓渚€寮借閺嬪酣鏌熼幆褍鏆遍柟顖滃仱濮婃椽宕崟顒€鍋嶉梺鎼炲妽濡炰粙骞冮敓鐘冲亜闁稿繗鍋愰崢顏堟椤愩垺澶勬繛鍙夌墪閻☆厽淇婇悙顏勨偓鎴﹀磿鏉堚晜宕叉慨妞诲亾鐎殿喖顭烽崺鍕礃閳轰緡鈧捇姊洪崨濠勭細闁稿孩鐩弫鎰緞鐎n剙骞嶅┑鐐存尰閼归箖鎮樺┑鍥︾箚闁稿繒顑曟禍婊勩亜閹板墎鎮奸柣顓熷笧閳ь剝顫夊ú鏍х暦椤掑啰浜欓梻渚€鈧偛鑻晶鎾煥濠靛牆浠辨い銏℃礋閺佸倻鎲撮敐鍡楊伖闂傚倷绀侀幉锛勭矙閹达腹鈧箓鍩€椤掑嫭鐓欓悗鐢登规牎闂佸搫妫欑划宥嗙┍婵犲洤围闁告侗鍘藉▓鏌ユ倵鐟欏嫭绀€鐎殿喖澧庨幑銏犫槈閵忕姷顓哄┑鐐叉缁绘帗绂掗懖鈺冪=濞达絽鎼鎾剁磽瀹ュ嫮绐旂€殿喖顭烽弫鎰緞婵犲嫮鏉告俊鐐€栭幐楣冨窗閹惧墎鐭欓柛銉墯閳锋帡鏌涚仦鎯у毈婵℃彃鎽滅槐鎺撳緞婵犲偆鏆㈠┑鈥冲级閸旀瑩鐛Ο灏栧亾闂堟稒鎲搁柟铏箞濮婃椽骞栭悙鎻掑Η闂佸憡娲﹂崢娲焽椤栨粎纾介柛灞捐壘閳ь剟顥撶划鍫熺瑹閳ь剝妫熼梻渚囧墮缁夊绮婚悩缁樼厵闁绘劦鍓氶妵鐔兼煛娴e壊鍎旈柡灞诲妼閳规垿宕卞鍡橈骏缂傚倷璁插褔宕戦幘瀵哥瘈婵炲牆鐏濋弸鐔兼煥閺囨娅婄€规洏鍨藉畷妤呮嚃閳哄﹥閿ゆ繝鐢靛Т閿曘倝鎮ф繝鍥х厱闁瑰濮风壕濂告倵閿濆骸骞楃痪顓炲缁辨帡鎮╅崘娴嬫灆闂佸搫鏈粙鎴g亽闂佺粯蓱瑜板啴寮虫繝鍥ㄧ厸閻庯綆鍋呴ˉ鍫ユ煟閹垮啫浜扮€规洖鐖兼俊姝岊槷濠殿喖娲娲箮閼恒儲鏆犻梺鎼炲妼濞尖€愁嚕鐠囨祴妲堟俊顖炴敱閺傗偓闂備胶纭堕崜婵嬨€冭箛鏃傤浄濠靛倸鎲¢埛鎴︽煕濠靛棗顏い銉у仱閺岋綁鎮㈤崣澶嬬彋閻庢鍠涢褔鍩ユ径濞炬瀻闁瑰濮峰Σ鍥⒒娴e懙褰掑嫉椤掑倻鐭欓柡宥庡亝閸忔粓鏌嶈閸撴稓妲愰幘璇茬<婵炲棙鍨肩粣妤呮⒑閸濄儱校闁绘濞€楠炲啳顦规鐐瘁缚閹风娀宕f径灞稿亾椤掑嫭鈷戦柣鐔告緲閳锋梻绱掗鍛仸鐎殿喗鐓¢獮鏍ㄦ媴閸︻厼寮抽梻浣虹帛濞叉牠宕愰崷顓涘亾濮樼偓瀚�
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2025 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();