当前位置:首页 » 安卓系统 » android设计原则

android设计原则

发布时间: 2022-08-15 06:12:27

⑴ Android 架构设计的思想与原则是什么

理解好Intent,就可以理解Android哲学("所有应用生来平等")的一部分。举个简单的例子,iOS里面应用要集成SNS如facebook/twitter/sina weibo等,都需要应用自己实现(iOS5也只是集成twitter一家);Android上只需要广播一个share内容的intent。从理解Intent如何工作开始,你就在慢慢理解Activity Manager, Package Manager, services这些Android的重要组件是如何工作的。

⑵ android自定义控件,一般遵循什么样的原则

开发自定义控件的步骤:
1、了解View的工作原理
2、 编写继承自View的子类
3、 为自定义View类增加属性
4、 绘制控件
5、 响应用户消息
6 、自定义回调函数

一、View结构原理
Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类。

View定义了绘图的基本操作
基本操作由三个函数完成:measure()、layout()、draw(),其内部又分别包含了onMeasure()、onLayout()、onDraw()三个子方法。具体操作如下:
1、measure操作
measure操作主要用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用下面的函数:
(1)onMeasure(),视图大小的将在这里最终确定,也就是说measure只是对onMeasure的一个包装,子类可以覆写onMeasure()方法实现自己的计算视图大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。

2、layout操作
layout操作用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能修改。layout()函数中有两个基本操作:
(1)setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,该函数用于将这些参数保存起来;
(2)onLayout(),在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的;

3、draw操作
draw操作利用前两部得到的参数,将视图显示在屏幕上,到这里也就完成了整个的视图绘制工作。子类也不应该修改该方法,因为其内部定义了绘图的基本操作:
(1)绘制背景;
(2)如果要视图显示渐变框,这里会做一些准备工作;
(3)绘制视图本身,即调用onDraw()函数。在view中onDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现自己的显示(比如TextView在这里实现了绘制文字的过程)。而对于ViewGroup则不需要实现该函数,因为作为容器是“没有内容“的,其包含了多个子view,而子View已经实现了自己的绘制方法,因此只需要告诉子view绘制自己就可以了,也就是下面的dispatchDraw()方法;
(4)绘制子视图,即dispatchDraw()函数。在view中这是个空函数,具体的视图不需要实现该方法,它是专门为容器类准备的,也就是容器类必须实现该方法;
(5)如果需要(应用程序调用了setVerticalFadingEdge或者setHorizontalFadingEdge),开始绘制渐变框;
(6)绘制滚动条;
从上面可以看出自定义View需要最少覆写onMeasure()和onDraw()两个方法。

二、View类的构造方法

创建自定义控件的3种主要实现方式:
1)继承已有的控件来实现自定义控件: 主要是当要实现的控件和已有的控件在很多方面比较类似, 通过对已有控件的扩展来满足要求。
2)通过继承一个布局文件实现自定义控件,一般来说做组合控件时可以通过这个方式来实现。
注意此时不用onDraw方法,在构造广告中通过inflater加载自定义控件的布局文件,再addView(view),自定义控件的图形界面就加载进来了。
3)通过继承view类来实现自定义控件,使用GDI绘制出组件界面,一般无法通过上述两种方式来实现时用该方式。

View(Context context)
Simple constructor to use when creating a view from code.
View(Context context, AttributeSet attrs)
Constructor that is called when inflating a view from XML.
View(Context context, AttributeSet attrs, int defStyle)
Perform inflation from XML and apply a class-specific base style.

三、自定义View增加属性的两种方法:
1)在View类中定义。通过构造函数中引入的AttributeSet 去查找XML布局的属性名称,然后找到它对应引用的资源ID去找值。
案例:实现一个带文字的图片(图片、文字是onDraw方法重绘实现)

public class MyView extends View {

private String mtext;
private int msrc;

public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
int resourceId = 0;

int textId = attrs.getAttributeResourceValue(null, "Text",0);
int srcId = attrs.getAttributeResourceValue(null, "Src", 0);

mtext = context.getResources().getText(textId).toString();

msrc = srcId;

}

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub

Paint paint = new Paint();
paint.setColor(Color.RED);
InputStream is = getResources().openRawResource(msrc);

Bitmap mBitmap = BitmapFactory.decodeStream(is);

int bh = mBitmap.getHeight();
int bw = mBitmap.getWidth();

canvas.drawBitmap(mBitmap, 0,0, paint);

//canvas.drawCircle(40, 90, 15, paint);
canvas.drawText(mtext, bw/2, 30, paint);
}

}

布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<com.example.myimageview2.MyView
android:id="@+id/myView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Text="@string/hello_world"
Src="@drawable/xh"/>

</LinearLayout>

属性Text, Src在自定义View类的构造方法中读取。

2)通过XML为View注册属性。与Android提供的标准属性写法一样。
案例: 实现一个带文字说明的ImageView (ImageView+TextView组合,文字说明,可在布局文件中设置位置)

public class MyImageView extends LinearLayout {

public MyImageView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
int resourceId = -1;
TypedArray typedArray = context.obtainStyledAttributes(attrs,
R.styleable.MyImageView);
ImageView iv = new ImageView(context);
TextView tv = new TextView(context);

int N = typedArray.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = typedArray.getIndex(i);

switch (attr) {
case R.styleable.MyImageView_Oriental:
resourceId = typedArray.getInt(
R.styleable.MyImageView_Oriental, 0);
this.setOrientation(resourceId == 1 ? LinearLayout.HORIZONTAL
: LinearLayout.VERTICAL);
break;

case R.styleable.MyImageView_Text:
resourceId = typedArray.getResourceId(
R.styleable.MyImageView_Text, 0);
tv.setText(resourceId > 0 ? typedArray.getResources().getText(
resourceId) : typedArray
.getString(R.styleable.MyImageView_Text));
break;

case R.styleable.MyImageView_Src:
resourceId = typedArray.getResourceId(
R.styleable.MyImageView_Src, 0);
iv.setImageResource(resourceId > 0 ?resourceId:R.drawable.ic_launcher);

break;

}

}

addView(iv);
addView(tv);
typedArray.recycle();

}

}

attrs.xml进行属性声明, 文件放在values目录下
<?xml version="1.0" encoding="utf-8"?>
<resources>

<declare-styleable name="MyImageView">
<attr name="Text" format="reference|string"></attr>
<attr name="Oriental" >
<enum name="Horizontal" value="1"></enum>
<enum name="Vertical" value="0"></enum>
</attr>
<attr name="Src" format="reference|integer"></attr>
</declare-styleable>

</resources>

MainActivity的布局文件:先定义命名空间 xmlns:uview="http://schemas.android.com/apk/res/com.example.myimageview2"
然后可以像使用系统的属性一样使用:uview:Oriental="Vertical"

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:uview="http://schemas.android.com/apk/res/com.example.myimageview2"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<com.example.myimageview2.MyImageView
android:id="@+id/myImageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
uview:Text="这是一个图片说明"
uview:Src="@drawable/tw"
uview:Oriental="Vertical">
</com.example.myimageview2.MyImageView>

</LinearLayout>

四、控件绘制 onDraw()

五、

六、自定义View的方法
onFinishInflate() 回调方法,当应用从XML加载该组件并用它构建界面之后调用的方法
onMeasure() 检测View组件及其子组件的大小
onLayout() 当该组件需要分配其子组件的位置、大小时
onSizeChange() 当该组件的大小被改变时
onDraw() 当组件将要绘制它的内容时
onKeyDown 当按下某个键盘时
onKeyUp 当松开某个键盘时
onTrackballEvent 当发生轨迹球事件时
onTouchEvent 当发生触屏事件时
onWindowFocusChanged(boolean) 当该组件得到、失去焦点时
onAtrrachedToWindow() 当把该组件放入到某个窗口时
onDetachedFromWindow() 当把该组件从某个窗口上分离时触发的方法
onWindowVisibilityChanged(int): 当包含该组件的窗口的可见性发生改变时触发的方法

⑶ Android app应用开发设计有哪些原则

不论是ios还是android的应用开发,其实都遵循着一定的开发流程,只有如此才能使开发过程有章可循而不是一团乱。 你的app应用是开发给谁用的? 是写给小孩玩的游戏,还是用来理财的记账类应用,每个应用都有固定的适用人群,而这决定你应用的内容是什么,也决定了要给使用者以什么样的用户体验。 互联网是个神奇的大网,大数据开发和软件定制也是一种模式,这里提供最详细的报价,如果你真的想做,可以来这里,这个手机的开始数字是一八七中间的是三儿零最后的是一四二五零,按照顺序组合起来就可以找到,我想说的是,除非你想做或者了解这方面的内容,如果只是凑热闹的话,就不要来了。 你的app应用是做什么的? 一个app有明确的使用目的是必须的。如何来明确?一个办法就是要去想清楚什么能吸引用户来使用你的app。 你的app能解决什么问题? 一个app应该致力于解决好一个问题而不是想能处理很多好无相关的问题,因为那样你就要考虑开发几个不同的app。每个app都应该专注解决一类问题。 设计用户界面。 有了明确的理念和构想,下面就是该设计用户界面了,用户界面是app使用者与你的app交互的地方,应该遵循简洁美观,便捷的原则,从app使用者的角度出发,带给用户良好的使用体验。 定义交互方式。 用户界面因为有了交互才变得有活起来。在app开发中,交互的启用都是通过用户操作的事件来触发的,比如手指的点击,滑动,捏合等操作。通过定义这些事件,我们可以精确地对用户的操作来给出响应,或者打开新的界面,或者提供展现的内容在当前界面上。 部署用户行为。 定义好交互方式后,接下来就要通过代码来实现这些定义好的行为了。可以说用户的所有操作都是通过我们实现的定义来得到响应的,如果没有前面明确的定义,那么会给用户带来困扰,这是一个好的app所不能出现的错误。 数据交互的部署。 有了设计好的用户界面和交互方式,接下来就要考虑数据的存储问题。 在界面与数据之间必须要定义明确的交互方式,尽管使用app的人是不直接和这些数据交互。一个好的数据模型是你app的坚实基础,使你的app更有扩展性,更易于将来的修改 上面讲解了APP开发的流程,下面来讲解开发APP的费用,简单来说就是这个APP需要多少人、做多长时间、人员的工资是多少。 对于APP外包开发的报价,一般取决于下面几个因素: 1、APP支持平台: 常见的APP移动平台包括谷歌Android、苹果iOS(iPhone/iPad),做的手机APP是针对其中某一个、还是两个平台都需要,对应了不同的开发成本。 除了APP本身,很多APP还有网站版的管理后台,管理后台的开发成本也需要考虑在内。 2、开发人员工资 一般来说,外包项目报价的基础是开发人员的工资,而工资又是和工作年限、经验、水平等决定的。这里的开发人员包括产品经理、UI设计师、前端工程师、服务端工程师、iOS和Android客户端工程师等,不同的外包项目需要的开发人员不同。 举个例子,假设一个iOS开发工程师一月工资22000元(工资数值仅举例),按照每月21.75个工作日来计算每天的开发费用,这里是每天(22000/21.75)=1000元,如果你考虑20%的利润,则每天费用变为了1000x(1+20%)=1200元。致电一八六零零三一四起吴零 (注:现实中,开发人员的工资之外,还有社保等其他人力成本支出) 3、产品功能的复杂程度 产品功能的复杂程度决定了所需要的开发人员和时间,开发需要30人/天和100人/天,价格是不同的。 接前面的例子,如果一个项目需要一个iOS开发工程师30人/天,那么按照1200元每天的价格,项目总费用就是(1200x30)=36000元。 4、外包团队经验和素质 如果是产品功能复杂的项目,外包团队的素质对最终结果影响很大,而好的团队则报价自然会更高一些。产品功能简单的项目,另当别论。 5、外包团队的所在地 同样能力的外包团队,在不同的城市也会导致开发成本的差异,比如在北京、深圳和上海的外包团队成本自然高一些,因为当地开发人员薪资和其他支出相对更高。 6、客户预算 如果产品需求很多,但是预算不够,那也白搭,因此客户应该根据预算了确定产品功能需求。 当然,一定会有甲乙双方讨价还价的过程,双方合作共赢才是王道。

⑷ Android 架构设计的思想与原则是什么

所有应用生而平等,也是为了不重复发明轮子,简化软件开发。
如果别的程序已经实现的功能,就不用重新实现,只需简单的startActivity或者broadcastIntent就可以调用别的组件。

⑸ android用到哪些设计模式

1 Android设计模式系列-组合模式
2 Android设计模式—策略模式
3 Android设计模式系列-单例模式
4 Android设计模式系列--工厂方法模式
5 Android设计模式系列-适配器模式
6 Android设计模式系列--原型模式
7 Android设计模式系列--观察者模式
8 Android设计模式系列--模板方法模式

⑹ Android架构设计的思想与原则是什么

rlei分析了Android的设计哲学:
理解好Intent,就可以理解Android哲学(所有应用生来平等)的一部分。举个简单的例子,iOS里面应用要集成SNS如facebook/twitter/sina weibo等,都需要应用自己实现(iOS5也只是集成twitter一家);Android上只需要广播一个share内容的intent。从理解Intent如何工作开始,你就在慢慢理解Activity Manager, Package Manager, Services这些Android的重要组件是如何工作的。
另外Binder是Android架构里非常核心的一块。Android基于Intent的消息传递和组件/应用解耦,下面的基础都是Binder IPC。在这一点上,Android实际上是光荣的传承了BeOS和Palm OS 6(悲催的OS6...)未能发扬光大的一部分。
MVC(Content Provider, Activity, Layout, Adapters)这个比较基础,也不算Android特有的。
Content Provider对数据访问的抽象也是比较有意思的一块。理想情况下,content provider可以让客户端用URI以语义化的方式访问数据(URI本身即表示数据层次结构和查询条件),而下面数据库表的结构可以任意变动,不影响客户端代码。当然实做的时候content provider还是会被各种复杂的where子句暴露出SQL的实现细节
至于Android的权限管理,其实比较简单,主要是利用现成的linux安全模型,进程之间相互隔离。API级别的权限管理和JVM类似。
Billy Cui重点解析了权限系统的设计:
Android的权限系统是基于Linux,但又增加了很多自己的控制模块。
总体上来说,其分为以下几部分权限系统:
1. userid : 继承于linux,对于多个app,通过shareuid的方式可以使用同一个userid,主要承担一些目录访问权限之类的工作,比如私有目录只能由同一uid应用访问。
2. 安装level:system level or app level,这个是根据应用的安装位置决定的,在system/app下安装的应用就是system level,在权限访问中会得到更多的权限,比如静默安装应用的权限等。
3. permission : 这个是最主要的权限控制,一般开发者开发应用主要是接触这个部分,在这部分中,会根据应用在AndroidManifest.xml中声明的use-permission而在访问相应api或资源时判断其是否有访问权限,比如常用的android.permission.INTERNET等。
4. signature: 签名,是Android权限系统中的重要组成部分,对于系统签名的应用,会有一些特殊的功能,而shareuid等特性也是需要同一签名作为基础。此外,permission在设置/自定义其权限时也经常会使用到签名,比如控制只有我自己的应用才可以访问我自己定义的公开API。
除此以外,其实Android在uid的里面设置了一些预定义有特殊功能的uid,比如system/media等,在配置其system level的services的时候会用到。
董兆辉则认为Android主要是基于组件搭配思想:
说到Android架构的设计思想和原则,按我的理解主要是组件搭配,即在用户看来,所有的mole或者组件,都是可以重复利用和简单组合的。想法是好的,不过有得必有失,或者说Android现在做的还不够好,在性能方面是很低的,否则的话Android也不会推出补丁(NDK之类的,dalvik的不断升级)。
我觉得所有Framework或者平台或者语言都想给应用开发者最方便使用的接口,最人性化的体验,同时又要争取最大的性能,两者权衡折中吧。不过随着硬件速度的飞速增长,性能的权重会变低。
范怀宇还谈到了资源体系:
Android架设在Linux之上,因此,继承了Linux可移植性、用户管理机制、文件系统,等等。
Android的核心在Framework层,本质上,这是一个基于组件的应用开发系统,组件间通过消息(Intent)进行通信。一方面,Intent是通信信息的载体,另一方面,Intent也定义了Android组件的通信协议。
Android可以对组件所运行的进程做托管,在Android中,进程概念相当薄弱。依赖于进程托管,Android可以轻松支撑多任务多进程的应用模型。

⑺ android里有哪些设计模式

根据模式的目的可分为3类:
1.创建型模式:与对象的创建有关。
2.结构性模式:处理类与对象的组合。
3.行为性模式:对类或对象怎样交互和怎样 分配职责进行描述。
面向对象设计的2个基本原则:
1.针对接口编程,而不是针对实现编程。
2.优先使用对象组合,而不是类继承。
面向对象设计的5个设计原则:
1.单一职责原则(SRP)
2.开放封闭原则(OCP)
3.Liskov替换原则(LSP)
4.依赖倒置原则(DIP)
5.接口隔离原则(ISP)

23种设计模式:
1.创建型模式:
(1).工厂方法模式
(2).抽象工厂模式
(3).创建者模式
(4).原型模式
(5).单例模式
2.结构型模式:
(6).适配器模式
(7).桥模式
(8).组合模式
(9).装饰模式
(10).外观模式
(11).享元模式
(12).代理模式
3.行为型模式
(13).解释器模式
(14).模板方法模式
(15).职责链模式
(16).命令模式
(17).迭代器模式
(18).中介者模式
(19).备忘录模式
(20).观察者模式
(21).状态模式
(22).策略模式
(23).访问者模式

⑻ android架构设计需要注意什么

android架构设计需要注意的问题如下:
1.了解不同版本的特性包括IDE的。
如:AsyncTask3.0之后和之前的区别、Android 5.0的新的API、Android 6.0 不能用HttpClient 、AS2.0的新特性 等等。
2.掌握热门技术并了解其原理。
如:RxJava(响应式框架)、Retrofit(请求框架可以配合RxJava)、MVP(开发模式) hotfix(热修复)等等。
3.掌握测试工具(因为懂得测试查看才能更好的针对性去解决、每个方法都编写测试用例)。
如:查看布局层级、查看APP性能、查看APP安全 等等。
4.逆向工程(攻防兼备)。
5.有自己的开源项目(最好是MD风格的)。
6.熟悉gitflow更好的管理项目。
7.必须做笔记、可以写博客、最好写本书。
8.了解一些常用算法(做动画的时候还是有用的!)
9.关注最新技术、IT行业信息。
10.对于技术要有足够的深度和热情

⑼ Android 平台设计规范有哪些

1、尺寸以及分辨率:

Android的界面尺寸比较流行的有:480*800、720*1280、1080*1920,我们在做设计图的 时候建议是以 480*800的尺寸为标准;

2、界面基本组成元素:

界面基本组成元素包括:状态栏+导航栏+主菜单栏+内容区域;以480*800的尺寸为标准下的 各个元素的高度(其实导航栏和菜单栏每一个应用都或许不一样,android对于尺寸没有太明确的 数据规范)如下:

3、字体:

Android 系统中,Droid Sans 是默认字体,与微软雅黑很像;

4、操作栏:

1、”操作栏”对于 Android 应用来说是最重要的设计元素,它通常在应用运行的所有时间都呆 在屏幕顶部;

2、 操作栏的基本布局:

1向上+2 Spinner视图控制+3 重要操作按钮+4 更多操作:其中,向上按钮,点击后是去到 当前界面的上一个层级,非第一层级界面有此按钮,第一层级界面则无向上按钮;Spinner 是 用于展示内容的下拉菜单,其内容包括视图的快速切换和显示相关内容的完整信息;更多操作 (action overflow)是集合操作栏中不常用的和非重要操作的地方。

5、多面板布局:

多面板布局更多的是针对平板电脑,把手机端的目录视图和详情视图两个层级的界面,甚至更 多的页面,复合展示在同一个界面中,有效地利用平板电脑的屏幕空间,扁平化层级结构,简 化导航。这点在iPad上已经运用得相当娴熟了。

6、选择:

Android4.0中的长按与Android2.3及更早期的版本有很大的不同。早期版本长按操作后,是 出现情境菜单的浮出层。在Android4.0中,长按后在操作栏的位置会覆盖一个临时的情境操 作栏,不再弹出情境菜单浮出层。在临时情境操作栏的环境下,当前界面的内容项允许被单个 处理,也允许被批量处理。

7、返回和向上:

返回按键用在手机全局的虚拟导航栏中,基于用户最近查看的界面历史,采用时间倒序的方式, 连接界面间的关系。向上按钮用在操作栏的左侧,基于层级结构,点击后是去到当前界面的上一 个层级,若当前界面已经是最高一级,则没有向上按钮。

8、主题样式:

推出三套默认主题:Holo浅色主题、Holo深色主题、Holo浅色底+深色操作栏主题。主推app在 这三套默认主题的基础上做设计,以加快app研发效率,但只是建议使用,并没有完全强制。

9、触摸与反馈:

用户触摸应用中的可操作区域,应当在视觉上有响应,微小的反馈会给用户带来很好地效果;

10、按钮:

1、按钮的3种表现形式如下图:

2、对于仅包括图标的按钮,不需要使用背景色;

11、滑块:

滑块的几种表现形式如下图:

12、进度条:

如果某个操作需要花费很长的时间,就需要用进度条的指示和旋转圈的形式来表示:

1、如果你可以知道当前任务完成的比例,那么使用进度条,让用户了解大约还需要多久才能完成;

2、当使用旋转圆圈时,不要配以文字标签。旋转的圆圈已经表明了正在进行后台操作。

13、开关:

用户通过开关作出选择,包括3种形式:复选框+单选按钮+开关;

1、复选框:用户可以在一个集合中作出多个选择:

2、单选按钮:单选按钮允许用户在一个集合中做一次选择;

3、开关:开关控制单个选项的状态;

14、对话框:

应用通过对话框让用户作出决定或者填写一些信息,

1、对话框的左边一般情况下是取消按钮,右边是确定按钮;

⑽ 如何让动效符合iOS和Android设计原则

基于原则:
一、准确展示:视频Demo
二、操作体验:交互原型
基于这两点,第一个选择是Flash。
由于Apple的原因,Flash如今的境况可算是江河日下。但作为一个动效原型工具,它却有一些独特的优势。
优势1:可以直接导入AE生成的序列帧素材。
优势2:可以导出.apk或.ipa的安装包,共享给任何有手机的人。
三、协助开发:参数文档
根据实现原理,把对应的参数精确的写出来,这就是参数文档。对于动效来说,基本参数无非这三类:
1、动画的起始时间、持续时间(ration\ offset)
2、变化的属性(rotation\ position\ scale\ alpha)
3、运动速率(interpolator)
总结:
简单的说,要想准确传达设计可以分三步。
第一步:要快速可视化。
第二步:最大限度的还原使用场景。
第三步:把设计参数化,尽可能减少让工程师凭感觉开发的情况。

热点内容
androidubuntu 发布:2024-09-17 03:50:27 浏览:701
识梦源码 发布:2024-09-17 03:50:18 浏览:26
诺基亚密码忘了打什么电话 发布:2024-09-17 03:27:09 浏览:555
树深度优先算法 发布:2024-09-17 03:26:58 浏览:472
跳转页源码 发布:2024-09-17 03:13:05 浏览:543
html文件上传表单 发布:2024-09-17 03:08:02 浏览:785
聊天软件编程 发布:2024-09-17 03:00:07 浏览:726
linuxoracle安装路径 发布:2024-09-17 01:57:29 浏览:688
两个安卓手机照片怎么同步 发布:2024-09-17 01:51:53 浏览:207
cf编译后没有黑框跳出来 发布:2024-09-17 01:46:54 浏览:249