Android无限循环轮转广告页组件实现
新项目一个,不过又是首页广告栏组件,第三次写这个组件了。虽然也可以拷贝以前的代码整理一下完成任务,但还是打算封装一下,重构一下代码,也算是自己近段时间学习的一个检验吧。不错不错~~
先上效果图(其中第三幅图是单击后的跳转页面,也是本人的博客,做下广告哈!):
自定义类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剛鐦堥悗瑙勬礃閿曘垺淇婇幖浣肝ㄩ柕蹇曞С婢规洟鎮峰⿰鍛暭閻㈩垱甯炵划锝呂旈崨顔惧幍闂佽顔栭崰鏍€傛總鍛婄厱閻庯絻鍔屾俊浠嬫煏閸パ冾伃鐎殿喕绮欓幃浠嬫濞戞ḿ鍘掗梻鍌欑閹碱偊顢栭崶顒€绐楅柡宥庡幖缁犳牗淇婇妶鍌氫壕濡炪値鍋呯换鍫ュ箖濞嗘搩鏁嗛柍褜鍓熼、鏃堟晸閿燂拷
>更多相关文章
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 03-08消息称微软开发内部AI推理模型,或将成为Op
- 03-08美国法院驳回马斯克请求,未阻止OpenAI转型
- 03-08饿了么成立即时配送算法专家委员会 持续全局
- 03-08长安汽车:预计今年底长安飞行汽车将完成试
- 03-08谷歌推出虚拟试穿、AR美妆新功能
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御