实例介绍
【实例截图】
【核心代码】
package com.android.graphic.iroom; import java.util.List; import com.android.graphic.iroom.R; import gocom.android.GoStyle.GOSTYLE; import gocom.android.GoStyle.Group; import gocom.android.GoStyle.Mesh; import gocom.android.GoStyle.OpenGLRenderer; import gocom.android.GoStyle.SimplePlane; import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.net.Uri; import android.opengl.GLSurfaceView; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.text.StaticLayout; import android.text.TextPaint; import android.text.Layout.Alignment; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceHolder; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.WindowManager; import android.widget.Toast; public class IroomMenuAppListView extends GLSurfaceView{ private static final String TAG = "IroomAppView"; public final int PageNUM = 10;// 最大支持十页 public int PAGE_LINE_NUM = 4;// 行 public int PAGE_ROW_NUM = 4;// 列 public int PAGE_ITEM_NUM = PAGE_LINE_NUM * PAGE_ROW_NUM;// 每页ITEM的数目 public final int CHILDNUM = 17;// 每页算法需要的元素的数目,包含背景等 public final int SPREADFRAME = 10;// 展开的帧数 public final int ICON_SIZE = 72; public final int BITMAP_SIZE = 128; public final int TEXT_HEIGHT = 56; public final int TEXT_START = 8; private final float START_TOUCH_MOVE_PIX = 5; private static final int SNAP_VELOCITY = 200; private final int WHOLEPASSFRAME = 20; private final int GO_MENU_STYLE_MAX_NUM = 15; private final int VIEW_UP_MAGIN = 30; private final int VIEW_LEFT_MAGIN = -8; private final int VIEW_BOTTOM_MAGIN = 30; private int BOTTOM_BAR_HEIGHT;// public Group[] muPages = null; public SimplePlane[][] iconcollection; public SimplePlane[][] textcollection; public boolean isinit = false; public int mCurEffect = 0; public static final int PANEL_NUM = 4; public final SimplePlane panel[] = new SimplePlane[PANEL_NUM]; public Bitmap panelframe; private OpenGLRenderer renderer; private IRoomActivity mHome; private int mCurscreen = 0; private int mViewWidth = 480; private int mViewHeight = 762; private GOSTYLE mCurStyle = GOSTYLE.GO_CLASSIC; private int cFrame = 0; private int tFrame = 20; private float xFrame = 0; private float mXoffset = 0; private float mXstart = 0; private boolean mIsGoRight = false; private boolean mIsMove = false; private VelocityTracker mVelocityTracker; private int mTouchSlop; private int mMaximumVelocity; private Thread menuThread; private boolean ischangepage = false; private boolean isoneframe = true; private boolean isinanim = false; private float scale; private List<ResolveInfo> mApps; private int mAppTotalNum = -1; private Context mContext; public IroomMenuAppListView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub Log.d(TAG, "construct"); // We want an 8888 pixel format because that's required for // a translucent window. // And we want a depth buffer. setEGLConfigChooser(8, 8, 8, 8, 16, 0);// 这个要放在set renderer前 mContext = context; renderer = new OpenGLRenderer(mContext); this.setRenderer(renderer); // 按需渲染 setRenderMode(RENDERMODE_WHEN_DIRTY); // setZOrderOnTop(true); // 设置透明 getHolder().setFormat(PixelFormat.TRANSLUCENT); BOTTOM_BAR_HEIGHT = (int) (context.getResources() .getDimension(R.dimen.button_bar_height)); final ViewConfiguration configuration = ViewConfiguration .get(getContext()); mTouchSlop = configuration.getScaledTouchSlop(); Log.d(TAG, "mTouchSlop :" mTouchSlop); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mCurscreen = 0; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // TODO Auto-generated method stub Log.d(TAG, "surfaceChanged" w); super.surfaceChanged(holder, format, w, h); mViewWidth = w; mViewHeight = h; if(mViewWidth>mViewHeight){ PAGE_LINE_NUM = 3;// 行 PAGE_ROW_NUM = 5;// 列 PAGE_ITEM_NUM = PAGE_LINE_NUM * PAGE_ROW_NUM;// 每页ITEM的数目 } else{ PAGE_LINE_NUM = 4;// 行 PAGE_ROW_NUM = 4;// 列 PAGE_ITEM_NUM = PAGE_LINE_NUM * PAGE_ROW_NUM;// 每页ITEM的数目 } resetParams(); initRender(mViewWidth,mViewHeight); startRender(true); } private void resetParams(){ ischangepage = false; isoneframe = true; isinanim = false; cFrame = 0; tFrame = 20; xFrame = 0; mXoffset = 0; mXstart = 0; mIsGoRight = false; mIsMove = false; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub Log.d(TAG, "surfaceCreated"); super.surfaceCreated(holder); resetParams(); if(mHome.mAppNumView != null){ mHome.mAppNumView.updateScreen(mCurscreen, getAppAllPageNum()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub Log.d(TAG, "surfaceDestroyed"); super.surfaceDestroyed(holder); } @Override protected void onVisibilityChanged(View changedView, int visibility) { // TODO Auto-generated method stub super.onVisibilityChanged(changedView, visibility); if(changedView == this){ if(mHome.mAppNumView != null){ if(visibility == View.VISIBLE){ mHome.mAppNumView.setVisibility(View.VISIBLE); }else { mHome.mAppNumView.setVisibility(View.GONE); } } } } @Override public boolean onTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub final int action = ev.getAction(); float x, y; Log.d(TAG, "onTouchEvent action :" action); if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(ev); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: x = ev.getX(); y = ev.getY(); if(!isinanim) { mcurX = mXstart = x; istpdown = true; isSpreadAnim = -1; } break; case MotionEvent.ACTION_MOVE: x = ev.getX(); y = ev.getY(); if ((Math.abs(x - mXstart) > START_TOUCH_MOVE_PIX&&istpdown == true)|| mIsMove) { mcurX = x; mIsMove = true; mIsGoRight = (x - mXstart) > 0 ? false : true; mXoffset = Math.abs(x - mXstart); startRender(false); } break; case MotionEvent.ACTION_UP: x = ev.getX(); y = ev.getY(); if(istpdown){ istpdown = false; if (mIsMove) { final VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); final int velocityX = (int) velocityTracker.getXVelocity(); mXoffset = Math.abs(x - mXstart); upVecX = velocityX; mcurX = x; cFrame = 0; if (mXoffset > mViewWidth / 2 || Math.abs(velocityX) > SNAP_VELOCITY) { tFrame = (int) (WHOLEPASSFRAME * (1 - (mXoffset / mViewWidth))); if (tFrame == 0) { tFrame = 1; } ischangepage = true; InitSlideInfo(); } else { ischangepage = false; tFrame = 10;//(int)(WHOLEPASSFRAME *((Math.abs(mcurX-mstartX)/mViewWidth))); } startMenuAppRunnable(); mIsMove = false; } else { int position = getTpSelectItemPosition(x, y); startSelectItem(position); } if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } break; } } return true; } private int upVecX = 0; private float oneX = 0; private float mcurX = 0; private int isSpreadAnim = -1;//-1代表正常状态,0代表收缩,1代表动画稳定态,2代表展开 private boolean istpdown = false; private void InitSlideInfo() { Log.d(TAG, "upVecX :" upVecX); // mslideInfo.cosWdata =upVecX/MAXVECX; mslideInfo.cosWdata = upVecX / mMaximumVelocity; mslideInfo.sinWdata = (float) Math.sin(-Math.acos(mslideInfo.cosWdata)); if (1 != mslideInfo.sinWdata) { mslideInfo.a = ((Math.abs(mcurX - mXstart)) - mViewWidth) / (mslideInfo.sinWdata - 1); } mslideInfo.b = mViewWidth - mslideInfo.a; mslideInfo.w = mMaximumVelocity / mslideInfo.a; mslideInfo.xPlusdx = (float) -Math.acos((mslideInfo.cosWdata)); } private float loop_fuction_veccontinue() { float d_angle = 0; d_angle = (float) (Math.PI / 2 - mslideInfo.xPlusdx); oneX = (float) (mslideInfo.a * Math.sin(mslideInfo.xPlusdx d_angle * cFrame / tFrame) mslideInfo.b); return oneX; } private float loop_fuction() { oneX = (float) ((mcurX - mXstart) * Math .sin((double) (Math.PI / 2 Math.PI / 2 * cFrame / tFrame))); Log.d(TAG, "cFrame :" cFrame); Log.d(TAG, "tFrame :" tFrame); Log.d(TAG, "oneX :" oneX); return Math.abs(oneX); } private slideifo mslideInfo = new slideifo(); private class slideifo { public float a; public float w; public float b; public float sinWdata; public float cosWdata; public float xPlusdx; public slideifo() { } } private void computeScrollEX() { Log.d(TAG,"cFrame:" cFrame); Log.d(TAG,"tFrame:" tFrame); Log.d(TAG,"istpdown:" istpdown); Log.d(TAG,"ischangepage:" ischangepage); if(!istpdown) { if(isSpreadAnim == -1) { mXoffset = 0; } else if(isSpreadAnim == 1||isSpreadAnim == 0) { if(cFrame == tFrame) { return; } cFrame ; if(ischangepage) { mXoffset = loop_fuction_veccontinue(); if(mXoffset>=mViewWidth||cFrame == tFrame) { mXoffset = mViewWidth; mcurX = mViewWidth; } } else { mXoffset = loop_fuction(); if(mXoffset <= 0||cFrame == tFrame) { mXoffset = 0; mcurX = 0; } } } } } public void sendMsgToUpdateNumView(){ int what = 0; mHandler.sendEmptyMessage(what); } private void setCurScreen(int index) { if (index > 0) { mCurscreen = index % getAppAllPageNum(); } else { mCurscreen = (getAppAllPageNum() - Math.abs(index)) % getAppAllPageNum(); } sendMsgToUpdateNumView(); } public int getTpSelectItemPosition(float x, float y) { int position = 0; int curScreenPosition = 0; int gridW = mViewWidth / PAGE_ROW_NUM; int gridH = (mViewHeight - BOTTOM_BAR_HEIGHT - VIEW_UP_MAGIN - VIEW_BOTTOM_MAGIN) / PAGE_LINE_NUM; Log.d(TAG, "getTpSelectItemPosition x = " x "y= :" y); curScreenPosition = ((int) (y - VIEW_UP_MAGIN)/ gridH) * PAGE_ROW_NUM (int) x / gridW; Log.d(TAG, "getTpSelectItemPosition curScreenPosition " curScreenPosition); if(curScreenPosition<0||curScreenPosition>=PAGE_ITEM_NUM){ return -1; } position = curScreenPosition mCurscreen * PAGE_ITEM_NUM; return position; } void startActivitySafely(Intent intent) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { mHome.StartActivityWithAnimation(intent); } catch (ActivityNotFoundException e) { Toast.makeText(mHome, "activity not found", Toast.LENGTH_SHORT).show(); Log.e(TAG, "Unable to launch " " intent=" intent, e); } catch (SecurityException e) { Toast.makeText(mHome, "activity not found", Toast.LENGTH_SHORT).show(); Log.e(TAG, "Launcher does not have the permission to launch " intent ". Make sure to create a MAIN intent-filter for the corresponding activity " "or use the exported attribute for this activity. " " intent=" intent, e); } } public void startSelectItem(int position) { Log.d(TAG, "startSelectItem position " position); if(position<0||position>=getAppItemNum()){ return; } Intent i = mHome.mIroomLoadApp.getItemInfo(position).intent; startActivitySafely(i); } public GOSTYLE getMenuStyle(int index) { GOSTYLE style = GOSTYLE.GO_CLASSIC; switch (index) { case 0:// 随机 style = GOSTYLE.GO_RANDOM; break; case 1: style = GOSTYLE.GO_CLASSIC; break; case 2: style = GOSTYLE.GO_BALL; break; case 3: style = GOSTYLE.GO_CUBE; break; case 4: style = GOSTYLE.GO_CYLINDER; break; case 5: style = GOSTYLE.GO_MIDROTATE; break; case 6: style = GOSTYLE.GO_MIDS; break; case 7: style = GOSTYLE.GO_PUSH; break; case 8: style = GOSTYLE.GO_ROLL; break; case 9: style = GOSTYLE.GO_SHUTTER; break; case 10: style = GOSTYLE.GO_SMALLINOUT; break; case 11: style = GOSTYLE.GO_BINARY; break; case 12: style = GOSTYLE.GO_BAR; break; case 13: style = GOSTYLE.GO_BOXIN; break; case 14: style = GOSTYLE.GO_CIRCLE; break; case 15: style = GOSTYLE.GO_SMALLBOX; break; default: style = GOSTYLE.GO_CLASSIC; break; } return style; } public void setAppHome(IRoomActivity home) { mHome = home; final Resources resources = mHome.getResources(); final DisplayMetrics metrics = resources.getDisplayMetrics(); scale = metrics.density; } private void initRender(final int totalwidth,final int totalheight) { Log.d(TAG, "initRender"); queueEvent(new Runnable() { //@Override public void run() { // TODO Auto-generated method stub Log.d(TAG, "initRender run!"); int pageIndex = 0; muPages = new Group[PageNUM]; iconcollection = new SimplePlane[PageNUM][]; renderer.Pages = muPages; renderer.iconArr = iconcollection; for (pageIndex = 0; pageIndex < PageNUM; pageIndex ) { muPages[pageIndex] = new Group(); iconcollection[pageIndex] = new SimplePlane[CHILDNUM]; for (int i = 0; i < CHILDNUM; i ) { iconcollection[pageIndex][i] = new SimplePlane(); } } panelframe = BitmapFactory.decodeResource(getResources(), R.drawable.panel_frame_big); for (int i = 0; i < PANEL_NUM; i ) { panel[i] = new SimplePlane(); } renderer.InitGoRender(CHILDNUM, CHILDNUM, SPREADFRAME, false, panel); initCalcData(); isinit = true; } }); } public int getAppAllPageNum() { int pagenum = 0; int ret = 2; pagenum = getAppItemNum() / PAGE_ITEM_NUM; ret = (getAppItemNum() % PAGE_ITEM_NUM == 0) ? pagenum : pagenum 1; if (ret == 0) { ret = 2; } Log.d(TAG, "getAppAllPageNum = " ret); return ret; } public int getAppItemPageNum(int position) { return position / PAGE_ITEM_NUM; } public int getPageItemNum(int page_index) { int item_num = 0; if (page_index == getAppAllPageNum() - 1) { if(getAppItemNum() == getAppAllPageNum()*PAGE_ITEM_NUM){ item_num = PAGE_ITEM_NUM; } else{ item_num = getAppItemNum() % PAGE_ITEM_NUM; } } else { item_num = PAGE_ITEM_NUM; } return item_num; } public Bitmap getAppItemBmp(int position) { final ContentResolver cr = mContext.getContentResolver(); Bitmap iconbmp = null; String icontext = null; IRoomApplicationInfo info = mHome.mIroomLoadApp.getItemInfo(position); iconbmp = info.iconBitmap; icontext = (String)info.title; // include icon and name Bitmap tempbmp = Bitmap.createBitmap(BITMAP_SIZE, BITMAP_SIZE, Config.RGB_565); Canvas c = new Canvas(tempbmp); Log.d(TAG,"creat tempbmp = " tempbmp); if (iconbmp != null&&!iconbmp.isRecycled()) { int iconW = iconbmp.getWidth(); int iconH = iconbmp.getHeight(); c.drawBitmap(iconbmp, new Rect(0, 0, iconW, iconH), new Rect( (BITMAP_SIZE - ICON_SIZE) / 2, 0, (BITMAP_SIZE ICON_SIZE) / 2, ICON_SIZE), null); } else{ Log.d(TAG,"iconbmp is null"); } if (icontext != null) { TextPaint textPaint = new TextPaint(); textPaint.setTypeface(Typeface.DEFAULT); textPaint.setTextSize(13*scale); textPaint.setColor(0xffffffff); textPaint.setAntiAlias(true); StaticLayout layout = new StaticLayout(icontext, textPaint, (int)BITMAP_SIZE - 2 * TEXT_START, Alignment.ALIGN_CENTER, 1, 0, true); c.translate(TEXT_START, ICON_SIZE); layout.draw(c); } return tempbmp; } static Bitmap getIconFromCursor(Cursor c, int iconIndex) { byte[] data = c.getBlob(iconIndex); try { return BitmapFactory.decodeByteArray(data, 0, data.length); } catch (Exception e) { return null; } } public void addMesh(Mesh mesh, int PageIndex) { muPages[PageIndex].add(mesh); } public void initCalcData() { int item_index = 0; int page_index = 0; int pagenum = getAppAllPageNum(); int pageitemnum = 0; int x = 0, y = 0; int position = 0; int gridW = 0; int gridH = 0; Log.d(TAG, "initCalcData start !"); gridW = (mViewWidth) / PAGE_ROW_NUM; gridH = (mViewHeight - BOTTOM_BAR_HEIGHT - VIEW_UP_MAGIN - VIEW_BOTTOM_MAGIN) / PAGE_LINE_NUM; Log.d(TAG, "totalheight" mViewHeight); for (page_index = 0; page_index < pagenum; page_index ) { pageitemnum = getPageItemNum(page_index); for (item_index = 0; item_index < pageitemnum; item_index ) { position = page_index * PAGE_ITEM_NUM item_index; Log.d(TAG, "position = " position); Bitmap tempbmp = getAppItemBmp(position); Log.d(TAG,"init calc Data = " tempbmp); x = (item_index % PAGE_ROW_NUM) * gridW VIEW_LEFT_MAGIN; y = (item_index / PAGE_ROW_NUM) * gridH VIEW_UP_MAGIN; iconcollection[page_index][item_index].Set(x, y, BITMAP_SIZE, BITMAP_SIZE, false, tempbmp); iconcollection[page_index][item_index].setVerticesLocation(x, y, BITMAP_SIZE, BITMAP_SIZE, mViewWidth, mViewHeight); addMesh(iconcollection[page_index][item_index], page_index); } } } public void startRender(boolean isUpdateOnly) { int curscreen = 0; int nextscreen = 0; int count = 0; int num1 = 0; int num2 = 0; count = getAppAllPageNum(); if(mIsGoRight) { curscreen = mCurscreen; nextscreen = (curscreen 1)%count; } else { curscreen = mCurscreen; nextscreen = (curscreen count - 1)%count; } num1 = getPageItemNum(curscreen); num2 = getPageItemNum(nextscreen); Log.d(TAG,"curscreen num:" num1); Log.d(TAG,"nextscreen num:" num2); Log.d(TAG,"curscreen :" curscreen); Log.d(TAG,"nextscreen :" nextscreen); updateumenusetparam(); Log.d(TAG,"isoneframe:" isoneframe); if(isSpreadAnim != -1||isoneframe||isUpdateOnly){ setMenuRender(mCurStyle, xFrame, mXoffset, 0, mViewWidth, mIsGoRight, num1, num2, curscreen, nextscreen, mViewWidth, mViewHeight); } else{ isinanim = false; } if(isSpreadAnim == -1) { isoneframe = false; } } private void setMenuRender(final GOSTYLE style, final float xframe, final float xoffset, final float yoffset, final float total_frame, final boolean isright, final int curnum, final int nextnum, final int curindex, final int nextindex, final int width, final int height) { Log.d(TAG, "setMenuRender"); queueEvent(new Runnable() { // @Override public void run() { Log.d(TAG, "setMenuRender run !!"); // TODO Auto-generated method stub Log.d(TAG, "style = " style); Log.d(TAG, "xframe = " xframe); Log.d(TAG, "xoffset = " xoffset); Log.d(TAG, "isright = " isright); Log.d(TAG, "curnum = " curnum); renderer.SetGoRender(style, xframe, xoffset, yoffset, total_frame, isright, curnum, nextnum, curindex, nextindex, width, height); requestRender(); } }); } public void startMenuAppRunnable(){ isinanim = true; menuThread = new Thread(new menuAppRunnable()); menuThread.start(); } class menuAppRunnable implements Runnable { // @Override public void run() { while (isinanim) { startRender(false); try { Thread.sleep(17); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } private void updateumenusetparam() { int count = 0; count = getAppAllPageNum(); computeScrollEX(); //如果是球或者圆柱,需要播放收缩展开的帧数 if(mCurStyle == GOSTYLE.GO_CYLINDER||mCurStyle == GOSTYLE.GO_BALL) { if(isSpreadAnim == -1&&istpdown)//开始收缩 { isSpreadAnim = 0; xFrame = 0; } else if(isSpreadAnim == 0&&!istpdown&&xFrame == 0)//收缩到正常 { isSpreadAnim = -1; mXoffset = 0; isoneframe = true; } else if(isSpreadAnim == 0&&xFrame == SPREADFRAME)//收缩到稳定态 { isSpreadAnim = 1; } else if(mXoffset%mViewWidth== 0 &&(isSpreadAnim==1) &&!istpdown )//开始展开,没有必要达到稳定状态才展开 { isSpreadAnim = 2; if(ischangepage) { xFrame = SPREADFRAME 1; } else { xFrame = SPREADFRAME; } } else if(isSpreadAnim == 2&&(xFrame == 2*SPREADFRAME||xFrame == 0))//展开到正常态 { isSpreadAnim = -1; isoneframe = true; if(ischangepage) { if(mIsGoRight) { mCurscreen ; } else { mCurscreen = count; mCurscreen--; } mCurscreen = mCurscreen%count; setCurScreen(mCurscreen); ischangepage = false; } } if(isSpreadAnim == 0) { if(istpdown) { xFrame ; } else { if(ischangepage) { xFrame ; } else { xFrame --; } } } else if(isSpreadAnim == 2) { if(ischangepage) { xFrame ; } else { xFrame --; } } } else { xFrame = 0; if(isSpreadAnim == -1&&istpdown)// { isSpreadAnim = 1; } else if(mXoffset%mViewWidth== 0 && isSpreadAnim == 1 && !istpdown ) { isSpreadAnim = -1; isoneframe = true; if(ischangepage) { if(mIsGoRight) { mCurscreen ; } else { mCurscreen = count; mCurscreen--; } mCurscreen = mCurscreen%count; setCurScreen(mCurscreen); ischangepage = false; } } } Log.d(TAG,"isSpreadAnim :" isSpreadAnim); } private void updateNumView(){ if(mHome.mAppNumView != null){ mHome.mAppNumView.updateScreen(mCurscreen, getAppAllPageNum()); } } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { updateNumView(); } }; public int getAppItemNum() { mAppTotalNum = mHome.mIroomLoadApp.getAppItemNum(); Log.d(TAG, "getAppItemNum = " mAppTotalNum); return mAppTotalNum; } }
标签: Android
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论