当前位置: 首页 > news >正文

网站开发技术教材网站建设的违约责任

网站开发技术教材,网站建设的违约责任,网站素材模板 站长,深圳市住房和建设局伍家有Android 自定义坐标曲线图_android 自定义曲线图-CSDN博客 继上一篇文章#xff0c;点击折线图上的点#xff0c;显示提示信息进行修改#xff0c;之前通过回调#xff0c;调用外部方法#xff0c;使用popupwindow或dialog来显示#xff0c;但是这种方法对于弹框显示的位…Android 自定义坐标曲线图_android 自定义曲线图-CSDN博客 继上一篇文章点击折线图上的点显示提示信息进行修改之前通过回调调用外部方法使用popupwindow或dialog来显示但是这种方法对于弹框显示的位置很难控制而且采用popupwindow或dialog是具有唯一性的也就是显示后必须先关闭才能显示下一个点的弹框这种在某些需求上是不符合的这种只适合每次只弹一个弹框且固定在底部或者居中显示就可以实现起来简单。这种方式只适合在页面只有一个折线图的情况下不适合运用到RecyclerView中每个item都出现折线图的情况。 如果是要显示在点击到的点的上方就很难控制无法精准并且在分辨率不同的手机会出现较大的差异。因此做了以下修改 更新如下20240329点击点提示信息不再使用popupwindow或dialog还是通过自定义引入xml布局来实现适合运用到页面只有一个折线图也适合RecyclerView中出现多个折线图的情况。具体实现代码如下 public void showDialog(Canvas c, Point point) {c.save();c.translate((point.x - dip2px(45f)), (point.y - dip2px(30f) - CIRCLE_SIZE / 2f));FrameLayout frameLayout new FrameLayout(mContext);frameLayout.setLayoutParams(new ViewGroup.LayoutParams(200, 200));LayoutInflater li (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);View v li.inflate(R.layout.dialog_valuation_tracker, null);v.setLayoutParams(newFrameLayout.LayoutParams(dip2px(90f), dip2px(26f)));frameLayout.addView(v);frameLayout.measure(bWidth, bHeight);frameLayout.layout(100, 100, 100, 100);frameLayout.draw(c);c.restore();} 可以看到是通过引入xml的形式来实现使用xml能更加的实现多样化样式要显示什么样子的提示框可自行在xml里面修改比如可以加入图片等并且可以更好的控制显示的位置。可以通过再添加一些方法给外部调用即可 完整代码如下 public class BrokenLineView extends View {private static final int CIRCLE_SIZE 40;private static enum LineStyle {LINE, CURVE}private static enum YLineStyle {DASHES_LINE, FULL_LINE, NOT_LINE}private static enum ShaderOrientationStyle {ORIENTATION_H, ORIENTATION_V}private final Context mContext;private OnClickListener listener;private LineStyle mStyle LineStyle.LINE;private YLineStyle mYLineStyle YLineStyle.NOT_LINE;private ShaderOrientationStyle mShaderOrientationStyle ShaderOrientationStyle.ORIENTATION_V;private int canvasWidth;private int bHeight 0;private int bWidth 0;private int marginLeft;private int marginRight;private boolean isMeasure true;private int xTextWidth 0;//Y textprivate int spacingHeight;private double averageValue;private int marginTop 0;private int marginBottom 0;/*** data*/private Point[] mPoints;private ListString yRawData new ArrayList();private ValuationTrackerPointData pointData;private ListString xRawData new ArrayList();private final ListDouble dataList new ArrayList();private final ListInteger xList new ArrayList();// x valueprivate final MapString, Integer xMap new HashMap();/*** paint color*/private int xTextPaintColor;private int yTextPaintColor;private int startShaderColor;private int endShaderColor;private int mCanvasColor;private int mXLinePaintColor;/*** paint size*/private int xTextSize 12;private int yTextSize 12;private Point mSelPoint;public BrokenLineView(Context context) {this(context, null);}public BrokenLineView(Context context, AttributeSet attrs) {super(context, attrs);this.mContext context;initView();}private void initView() {xTextPaintColor getColor(mContext, R.color.cl_858585);yTextPaintColor getColor(mContext, R.color.cl_858585);startShaderColor getColor(mContext, R.color.cl_c53355_30);endShaderColor getColor(mContext, R.color.cl_c53355_5);mCanvasColor getColor(mContext, R.color.white);mXLinePaintColor getColor(mContext, R.color.cl_EBEBEB);}public void setData(ValuationTrackerPointData pointData) {this.pointData pointData;averageValue pointData.getyAverageValue();xRawData.clear();yRawData.clear();dataList.clear();xRawData pointData.getxAxis();xRawData.add(0, );yRawData pointData.getyAxis();for (int i 0; i pointData.getPointInfo().size(); i) {dataList.add(pointData.getPointInfo().get(i).getPrice());}if (null ! dataList) {mPoints new Point[dataList.size()];}if (null ! yRawData) {spacingHeight yRawData.size();}}Overrideprotected void onSizeChanged(int w, int h, int oldW, int oldH) {if (isMeasure) {marginLeft dip2px(20);marginRight dip2px(10);marginTop dip2px(5);marginBottom dip2px(40);int canvasHeight getHeight();this.canvasWidth getWidth();if (bHeight 0) {bHeight canvasHeight - marginBottom - marginTop;}if (bWidth 0) {bWidth canvasWidth - marginLeft - marginRight;}isMeasure false;}}Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(mCanvasColor);//canvas color//draw X linedrawAllXLine(canvas);if (YLineStyle.DASHES_LINE mYLineStyle) {drawPathYDashesLine(canvas);//draw Y dashes line} else if (YLineStyle.FULL_LINE mYLineStyle) {drawAllYLine(canvas);// draw Y line} else {noDrawYLine(canvas);}// point initmPoints getPoints();//draw cure linedrawCurve(canvas);//draw Polygon bg colordrawPolygonBgColor(canvas);// is click pointif (null mSelPoint) {drawDot(canvas);// draw dot} else {clickUpdateDot(canvas);// update dot after click}}private void drawCurve(Canvas c) {Paint p new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(getColor(mContext, R.color.cl_c53355));p.setStrokeWidth(dip2px(1f));p.setStyle(Paint.Style.STROKE);if (mStyle LineStyle.CURVE) {drawScrollLine(c, p);} else {drawLine(c, p);}}private void drawDot(Canvas c) {if (null mPoints || mPoints.length 0) {return;}Paint p new Paint(Paint.ANTI_ALIAS_FLAG);p.setStyle(Paint.Style.FILL);for (Point point : mPoints) {p.setColor(getColor(mContext, R.color.cl_c53355));c.drawCircle(point.x, point.y, CIRCLE_SIZE / 2f, p);p.setColor(getColor(mContext, R.color.cl_d77188));c.drawCircle(point.x, point.y, CIRCLE_SIZE / 3f, p);}}private void clickUpdateDot(Canvas c) {if (null mPoints || mPoints.length 0) {return;}Paint p new Paint(Paint.ANTI_ALIAS_FLAG);p.setStyle(Paint.Style.FILL);for (Point point : mPoints) {if (null ! mSelPoint mSelPoint.x point.x mSelPoint.y point.y) {p.setColor(getColor(mContext, R.color.cl_c53355));c.drawCircle(point.x, point.y, CIRCLE_SIZE / 1.5f, p);p.setColor(getColor(mContext, R.color.cl_d77188));c.drawCircle(point.x, point.y, (CIRCLE_SIZE / 2f), p);showDialog(c, point);} else {p.setColor(getColor(mContext, R.color.cl_c53355));c.drawCircle(point.x, point.y, CIRCLE_SIZE / 2f, p);p.setColor(getColor(mContext, R.color.cl_d77188));c.drawCircle(point.x, point.y, CIRCLE_SIZE / 3f, p);}}}private void drawPolygonBgColor(Canvas c) {if (null mPoints || mPoints.length 0) {return;}Path p new Path();float startX 0;float endX 0;int endPoint mPoints.length - 1;for (int i 0; i mPoints.length; i) {if (i 0) {startX mPoints[i].x;p.moveTo(mPoints[i].x, 0);p.lineTo(mPoints[i].x, mPoints[i].y);} else {p.lineTo(mPoints[i].x, mPoints[i].y);if (i endPoint) {endX mPoints[i].x;}}}p.lineTo(endX, (bHeight marginTop));p.lineTo(startX, (bHeight marginTop));p.close();Paint paint new Paint();paint.setStyle(Paint.Style.FILL);Shader shader null;if (mShaderOrientationStyle ShaderOrientationStyle.ORIENTATION_H) {shader new LinearGradient(endX, (bHeight marginTop), startX, (bHeight marginTop),startShaderColor, endShaderColor, Shader.TileMode.REPEAT);} else {Point point getYBiggestPoint();if (null ! point) {shader new LinearGradient(point.x, point.y, endX, (bHeight marginTop),startShaderColor, endShaderColor, Shader.TileMode.REPEAT);}}paint.setShader(shader);c.drawPath(p, paint);}private Point getYBiggestPoint() {Point p null;if (null ! mPoints mPoints.length 0) {p mPoints[0];for (int i 0; i mPoints.length - 1; i) {if (p.y mPoints[i 1].y) {p mPoints[i 1];}}}return p;}private void drawPathYDashesLine(Canvas canvas) {if (null xRawData || xRawData.isEmpty()) {return;}Path path new Path();int dashLength 16;int blankLength 16;Paint p new Paint();p.setStyle(Paint.Style.STROKE);p.setStrokeWidth(4);p.setColor(getColor(mContext, R.color.colorGray));p.setPathEffect(new DashPathEffect(new float[]{dashLength, blankLength}, 0));for (int i 0; i xRawData.size(); i) {drawTextY(xRawData.get(i), (getMarginWidth() getBWidth() / xRawData.size() * i) - dip2px(8), bHeight marginTop dip2px(26),canvas);if (null ! xMap) {xMap.put(xRawData.get(i), getMarginWidth() getBWidth() / xRawData.size() * i);}int startX (getMarginWidth() getBWidth() / xRawData.size() * i);int startY marginTop;int endY bHeight marginTop;path.moveTo(startX, startY);path.lineTo(startX, endY);canvas.drawPath(path, p);}getPointX();}/*** draw Y*/private void drawAllYLine(Canvas canvas) {if (null xRawData || xRawData.isEmpty()) {return;}Paint p new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(getColor(mContext, R.color.colorBlack));for (int i 0; i xRawData.size(); i) {int w (getMarginWidth() getBWidth() / xRawData.size()) * i;canvas.drawLine(w, marginTop, w, (bHeight marginTop), p);drawTextY(xRawData.get(i), getMarginWidth() getBWidth() / xRawData.size() * i - dip2px(8), bHeight marginTop dip2px(26),canvas);if (null ! xMap) {xMap.put(xRawData.get(i), getMarginWidth() getBWidth() / xRawData.size() * i);}}getPointX();}private void noDrawYLine(Canvas canvas) {if (null xRawData || xRawData.isEmpty()) {return;}for (int i 0; i xRawData.size(); i) {drawTextY(xRawData.get(i), (getMarginWidth() getBWidth() / xRawData.size() * i) - dip2px(8), bHeight marginTop dip2px(26),canvas);if (null ! xMap) {xMap.put(xRawData.get(i), getMarginWidth() getBWidth() / xRawData.size() * i);}}getPointX();}private void getPointX() {if (null xMap || xMap.size() 0) {return;}if (null ! pointData !pointData.getPointInfo().isEmpty()) {for (ValuationTrackerPointData.PointInfo info : pointData.getPointInfo()) {for (Map.EntryString, Integer entry : xMap.entrySet()) {if (entry.getKey().equals(info.getMouth())) {xList.add(xMap.get(entry.getKey()));}}}}}/*** draw x*/private void drawAllXLine(Canvas canvas) {if (null yRawData || yRawData.isEmpty()) {return;}Paint p new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(mXLinePaintColor);p.setStrokeWidth(dip2px(1f));p.setStyle(Paint.Style.FILL);int h bHeight / spacingHeight;for (int i 0; i yRawData.size(); i) {drawTextX(yRawData.get(i), marginLeft / 2,bHeight - (bHeight / spacingHeight) * i marginTop dip2px(2), canvas);canvas.drawLine(getMarginWidth(), (bHeight - h * i marginTop), (canvasWidth - marginRight),(bHeight - h * i marginTop), p);}}private void drawScrollLine(Canvas canvas, Paint paint) {if (null mPoints || mPoints.length 0) {return;}Point startP;Point endP;for (int i 0; i mPoints.length - 1; i) {startP mPoints[i];endP mPoints[i 1];int wt (startP.x endP.x) / 2;Point p3 new Point();Point p4 new Point();p3.y startP.y;p3.x wt;p4.y endP.y;p4.x wt;Path path new Path();path.moveTo(startP.x, startP.y);path.cubicTo(p3.x, p3.y, p4.x, p4.y, endP.x, endP.y);canvas.drawPath(path, paint);}}private void drawLine(Canvas canvas, Paint paint) {if (null mPoints || mPoints.length 0) {return;}Point startP;Point endP;for (int i 0; i mPoints.length - 1; i) {startP mPoints[i];endP mPoints[i 1];canvas.drawLine(startP.x, startP.y, endP.x, endP.y, paint);}}private void drawTextY(String text, int x, int y, Canvas canvas) {if (null yRawData || yRawData.isEmpty()) {return;}Paint p new Paint(Paint.ANTI_ALIAS_FLAG);p.setTextSize(dip2px(yTextSize));p.setColor(yTextPaintColor);p.setTextAlign(Paint.Align.LEFT);canvas.drawText(text, x, y, p);}private void drawTextX(String text, int x, int y, Canvas canvas) {if (null xRawData || xRawData.isEmpty()) {return;}Paint p new Paint(Paint.ANTI_ALIAS_FLAG);p.setTextSize(dip2px(xTextSize));p.setColor(xTextPaintColor);p.setTextAlign(Paint.Align.LEFT);xTextWidth (int) p.measureText(text);canvas.drawText(text, x, y, p);}private Point[] getPoints() {Point[] points new Point[dataList.size()];for (int i 0; i dataList.size(); i) {int ph bHeight - (int) (((dataList.get(i) - pointData.getyAxisSmallValue()) / averageValue) * (bHeight * 1.0f / spacingHeight));points[i] new Point(xList.get(i), ph marginTop);}return points;}private int getMarginWidth() {if (xTextWidth 0) {return marginLeft;} else {return xTextWidth marginLeft;}}private int getBWidth() {if (xTextWidth 0) {return bWidth;} else {return bWidth - xTextWidth;}}SuppressLint(ClickableViewAccessibility)Overridepublic boolean onTouchEvent(MotionEvent event) {int x (int) event.getX();int y (int) event.getY();int action event.getAction();if (action MotionEvent.ACTION_DOWN) {dealClick(x, y);}return true;}private void dealClick(int x, int y) {if (null ! mPoints mPoints.length 0) {for (Point p : mPoints) {if ((p.x - CIRCLE_SIZE) x x (p.x CIRCLE_SIZE) (p.y - CIRCLE_SIZE) y y (p.y CIRCLE_SIZE)) {mSelPoint p;invalidate();if (null ! listener) {listener.onClick(this, p.x, p.y);}}}}}public void showDialog(Canvas c, Point point) {c.save();c.translate((point.x - dip2px(45f)), (point.y - dip2px(30f) - CIRCLE_SIZE / 2f));FrameLayout frameLayout new FrameLayout(mContext);frameLayout.setLayoutParams(new ViewGroup.LayoutParams(200, 200));LayoutInflater li (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);View v li.inflate(R.layout.dialog_valuation_tracker, null);v.setLayoutParams(newFrameLayout.LayoutParams(dip2px(90f), dip2px(26f)));frameLayout.addView(v);frameLayout.measure(bWidth, bHeight);frameLayout.layout(100, 100, 100, 100);frameLayout.draw(c);c.restore();}public void setAverageValue(int averageValue) {this.averageValue averageValue;}public void setMarginTop(int marginTop) {this.marginTop marginTop;}public void setMarginBottom(int marginBottom) {this.marginBottom marginBottom;}public void setMStyle(LineStyle mStyle) {this.mStyle mStyle;}public void setMYLineStyle(YLineStyle style) {this.mYLineStyle style;}public void setShaderOrientationStyle(ShaderOrientationStyle shaderOrientationStyle) {this.mShaderOrientationStyle shaderOrientationStyle;}public void setBHeight(int bHeight) {this.bHeight bHeight;}public void setXTextPaintColor(int xTextPaintColor) {this.xTextPaintColor xTextPaintColor;}public void setYTextPaintColor(int yTextPaintColor) {this.yTextPaintColor yTextPaintColor;}public void setXTextSize(int xTextSize) {this.xTextSize xTextSize;}public void setYTextSize(int yTextSize) {this.yTextSize yTextSize;}public void setXLinePaintColor(int color) {mXLinePaintColor color;}public void setShaderColor(int startColor, int endColor) {this.startShaderColor startColor;this.endShaderColor endColor;}private int dip2px(float dpValue) {float scale mContext.getResources().getDisplayMetrics().density;return (int) (dpValue * scale 0.5f);}public interface OnClickListener {void onClick(View v, int x, int y);}public void setListener(OnClickListener listener) {this.listener listener;} }
文章转载自:
http://www.morning.qbnfc.cn.gov.cn.qbnfc.cn
http://www.morning.fkmrj.cn.gov.cn.fkmrj.cn
http://www.morning.trjdr.cn.gov.cn.trjdr.cn
http://www.morning.trbxt.cn.gov.cn.trbxt.cn
http://www.morning.nxstj.cn.gov.cn.nxstj.cn
http://www.morning.guanszz.com.gov.cn.guanszz.com
http://www.morning.tndhm.cn.gov.cn.tndhm.cn
http://www.morning.mrlkr.cn.gov.cn.mrlkr.cn
http://www.morning.dzgmj.cn.gov.cn.dzgmj.cn
http://www.morning.rmmz.cn.gov.cn.rmmz.cn
http://www.morning.rzrbw.cn.gov.cn.rzrbw.cn
http://www.morning.ksbmx.cn.gov.cn.ksbmx.cn
http://www.morning.czwed.com.gov.cn.czwed.com
http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn
http://www.morning.jlnlr.cn.gov.cn.jlnlr.cn
http://www.morning.lsxabc.com.gov.cn.lsxabc.com
http://www.morning.lwxsy.cn.gov.cn.lwxsy.cn
http://www.morning.mqxrx.cn.gov.cn.mqxrx.cn
http://www.morning.cmcjp.cn.gov.cn.cmcjp.cn
http://www.morning.mdgpp.cn.gov.cn.mdgpp.cn
http://www.morning.qrsm.cn.gov.cn.qrsm.cn
http://www.morning.ndynz.cn.gov.cn.ndynz.cn
http://www.morning.bgdk.cn.gov.cn.bgdk.cn
http://www.morning.lbbyx.cn.gov.cn.lbbyx.cn
http://www.morning.ygth.cn.gov.cn.ygth.cn
http://www.morning.nlzpj.cn.gov.cn.nlzpj.cn
http://www.morning.xqtqm.cn.gov.cn.xqtqm.cn
http://www.morning.ypdhl.cn.gov.cn.ypdhl.cn
http://www.morning.gmrxh.cn.gov.cn.gmrxh.cn
http://www.morning.xrksf.cn.gov.cn.xrksf.cn
http://www.morning.prgyd.cn.gov.cn.prgyd.cn
http://www.morning.fcqlt.cn.gov.cn.fcqlt.cn
http://www.morning.fwcjy.cn.gov.cn.fwcjy.cn
http://www.morning.xmyrn.cn.gov.cn.xmyrn.cn
http://www.morning.txfzt.cn.gov.cn.txfzt.cn
http://www.morning.gnkbf.cn.gov.cn.gnkbf.cn
http://www.morning.tqhpt.cn.gov.cn.tqhpt.cn
http://www.morning.zhghd.cn.gov.cn.zhghd.cn
http://www.morning.jqkjr.cn.gov.cn.jqkjr.cn
http://www.morning.xgcwm.cn.gov.cn.xgcwm.cn
http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn
http://www.morning.cywf.cn.gov.cn.cywf.cn
http://www.morning.njddz.cn.gov.cn.njddz.cn
http://www.morning.jynzb.cn.gov.cn.jynzb.cn
http://www.morning.lnrhk.cn.gov.cn.lnrhk.cn
http://www.morning.zshuhd015.cn.gov.cn.zshuhd015.cn
http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn
http://www.morning.kpbn.cn.gov.cn.kpbn.cn
http://www.morning.gyqnp.cn.gov.cn.gyqnp.cn
http://www.morning.rlsd.cn.gov.cn.rlsd.cn
http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn
http://www.morning.lmctj.cn.gov.cn.lmctj.cn
http://www.morning.snjpj.cn.gov.cn.snjpj.cn
http://www.morning.dshkp.cn.gov.cn.dshkp.cn
http://www.morning.fphbz.cn.gov.cn.fphbz.cn
http://www.morning.htbbp.cn.gov.cn.htbbp.cn
http://www.morning.pnbls.cn.gov.cn.pnbls.cn
http://www.morning.fhqsm.cn.gov.cn.fhqsm.cn
http://www.morning.qcfgd.cn.gov.cn.qcfgd.cn
http://www.morning.qrksj.cn.gov.cn.qrksj.cn
http://www.morning.dpflt.cn.gov.cn.dpflt.cn
http://www.morning.zwppm.cn.gov.cn.zwppm.cn
http://www.morning.kdtdh.cn.gov.cn.kdtdh.cn
http://www.morning.ptzf.cn.gov.cn.ptzf.cn
http://www.morning.bwfsn.cn.gov.cn.bwfsn.cn
http://www.morning.crfjj.cn.gov.cn.crfjj.cn
http://www.morning.cmldr.cn.gov.cn.cmldr.cn
http://www.morning.mhcys.cn.gov.cn.mhcys.cn
http://www.morning.lyrgp.cn.gov.cn.lyrgp.cn
http://www.morning.ykmkz.cn.gov.cn.ykmkz.cn
http://www.morning.bkqdg.cn.gov.cn.bkqdg.cn
http://www.morning.xbzfz.cn.gov.cn.xbzfz.cn
http://www.morning.jcxyq.cn.gov.cn.jcxyq.cn
http://www.morning.mdpcz.cn.gov.cn.mdpcz.cn
http://www.morning.rxhsm.cn.gov.cn.rxhsm.cn
http://www.morning.rpjr.cn.gov.cn.rpjr.cn
http://www.morning.nlpbh.cn.gov.cn.nlpbh.cn
http://www.morning.mbpfk.cn.gov.cn.mbpfk.cn
http://www.morning.jhwwr.cn.gov.cn.jhwwr.cn
http://www.morning.mmosan.com.gov.cn.mmosan.com
http://www.tj-hxxt.cn/news/239124.html

相关文章:

  • 网站app怎么做百度后台登录
  • ftp网站后台集团型网站建设
  • 网站支付功能建设网页设计基础课程教学目标
  • 软件开发网站开发培训建站开发工具
  • 免费源码分享网站免费行情软件网站下载ww
  • 小鱼儿企业网站管理系统wordpress.主题
  • 建设网站需要什么设施?wordpress减少请求
  • 漯河网站seo微信数据统计小程序
  • 网站悬浮窗口洛阳网站建设汉狮报价
  • 新手做网站视频京口区建设局网站
  • 自己做的网站怎么让别人能访问dw网站的滑屏怎么做
  • 我的世界做mc壁纸的网站什么推广网站好
  • 公司汇报网站建设方案led企业网站策划
  • 建筑企业网站源码零基础自学python
  • 成都平台网站建设家庭装修设计平台
  • 网站排名优化策划wordpress添加文章子标题
  • 国内外做gif的网站企业做网站系统
  • 惠州网站设计培训阜新公司做网站
  • 网站建设最新模板wordpress 修改代码
  • 网站建设公司(推荐乐云践新)有高级感的公司名字
  • 如何看网站开发语言自学网站查分数
  • 吉林律师网站建设多少钱新闻类网站设计
  • 做外贸好的网站网店代运营公司哪家强
  • 知名高端网站设计企业网站开发频道构架
  • 十大电子商务网站制作网站建设规划书的结构为
  • 做网站去哪里找广告主提高wordpress访问速度
  • 分析可口可乐网站建设的目的怎么开网店流程
  • 网站建设平台合同模板下载kaalus wordpress
  • 网站刷链接怎么做的网站的建设需要虚拟机吗
  • 大访问量的网站怎么做优化做网站资料