reeder是谁发明的(e的发明者)
本篇百科问答的知识要给大家谈谈reeder是谁发明的,以及e的发明者对应的知识点,希望对学习有所帮助。
文章目录:
Material Design 是一个怎样的设计风格
“Material”中文译为“材料”,它代表着物质的组成成分,如果放在手机系统设计中,这个词会让人很容易的联想到手机系统的界面风格设 计,比如拟物和扁平风格。不过此次谷歌的塌巧橘Material design并不是一种系统界面设计风格,Material design其实是单纯一种设计语言,它包含了系统界面风格、交互、UI等,此外对于谷歌来说,Material design还有着非常伟大的使命,那就是打造一个横跨所有设备的统一的设计语言,像是手机、桌面端、可穿戴设备等今天就请大家跟随这小编的脚步,来看看 这次谷歌全新设计理念Material design。
系统界面风格
“鲜明、形象、深思熟虑”,Material design此次的界面风格设计用这几个词语来形容是再合适不过了。Material design为安卓提供了新的视觉语言,在基本元素的处理上,借鉴了传统的印刷设计、字体版式、网格系统、空间、比例、配色、图像使用。在这些设计基础上 下功夫,从而能够构建出视觉层级、视觉意义以及视觉聚焦。精心选择色彩、图像、选择合乎比例的字体、留白,力求构建出鲜明、形象的用户界面,使得新的系统 界面是如此的漂亮。
而在色彩的选择上Material design的原则是“大胆、图形化、有意义”。在Material Design中,UI配色提倡一种主色,一种互补色。在区域较大部分的色彩采用主色的500色调,区域较小的部分例如状态栏采用深一点的色调。如此巧妙的 色彩搭配使得应用看起来非常的大胆、充满色彩感,凸显内容。
Material design对于界面的排版非常的重视。众所周知,好的排版会让界面看起来非常的清爽,不会有杂乱无章的感觉,而要将排版做好,“基线”绝对是必不可少的 一样东西。谷歌官方文档《Material Design排版边距》中就有提到基线的摆放位置,由下图中我们可以看出,Material Design将第一基线放在距离边界16dp的地方,与文本项对齐的第二基线被摆放到距离左边界72dp的地方,这种对齐规则让界面看起来清团团爽、具有印刷 设计的阅读节奏感。让用户得以快速阅读信息,比较符合格式塔原则。
整体来说,Material design为安卓带来一次改革,系统的界面风格和布局都有了很大的改变,安卓系统自身的风格也渐渐显露雏形。终于不会在有人说安卓原生系统难看了。
令人愉悦的交互设计
Material design的交互设计上采用的是响应式交互宽亏,这样的交互设计能把一个应用从简单展现用户所请求的信息,提升至能与用户产生更强烈、更具体化交互的工具。接下来我们选择几个简单的动态图,来看下Material design独特的交互设计。
“初中英语不会读”最好用什么软件?
扇贝、沪江英语、有道词典、百词斩、朗易思听、Omegle、Reeder、Papership、Papership、Economist
扇贝:扇贝单词、扇贝听力、扇贝口语、扇贝新闻、扇贝读书、扇贝炼句,六大应用让你在手机上就可以完成整个学习过程,有效地提升英语词汇及听说读写能力。
沪江英语:沪江英语是沪江外语网中的英语站,国内最早以及最具亲和力的英语学习站,提供国内领先的外语互联网门户媒体、B2C电子商务、网络SNS学习社区、外语互联网扒键此学习工具在内的全套外语数字教育网络服务,致力于为国内外的英语学习者、教育者提供优质英语互动学习平台和学习资讯。
有道词典:有道词典是由网易有道出品的全球首款基于搜索引擎技术的全能免费语言翻译软件。有道词典通过独创的网络释义功能,轻松囊括互联网上的流行词汇与海量例句,并完整收录《柯林斯高级英汉双解词典》、《21世纪大英汉词典》等多部权威词典数据,词库大而全,查词快且准。结合丰富的原声视频音频例句,总共覆盖3700万词条和2300万海量例句。有道词典集成中、英、日、韩、法多语种专业词典,切换语言环境,即可快速翻译所需内容,网页版有道翻译还支持中、英、日、韩、法、西、俄七种语言互译。新增的图解词典和百科功能,提供了一站式知识查询平台,能够有效帮助用户理解记忆新单词,而单词本功能更是让用户可以随时随地导入词库背单词。
百词斩:百词斩是由成都超有爱科技有限公司针对英语学习开发的一款“图背单词软件”。软件为每一个单词提供了趣味的配图和例句,让记单词成为一种乐趣。百词斩覆盖了从初高中、四六级、考研、到雅思、托福、SAT、GMAT、GRE等全部英语考试词表。适合从12岁到24岁的所有学生群体,备考英语。
朗易思听:界面简洁,特色是能够利用线控进行跟读,上班族可以通勤时间练听力用。每天都会更新一些听力资源,里面有考题、美剧等。这个App里面听力资源是按句子断句时间点切割好的。
Omegle:完全匿名,根本不会有任何担心,口音、语法、发音、拼写,统统无所谓,对方是谁、该聊什么忌讳什么,全都没关系。你只需要打开话匣子,用英语表达出你的想法跟别人沟通就行,聊聊天轻松提高英语表达姿势水平。你能用拇指聊天就可以了,真正聊天的时候口音真没那么重要,你说什么才最重要。
Reeder:阅读这件事,应该靠兴趣驱动、学英语只是顺带的事情。而Reeder是最好的rss阅读器,而基本上各大新闻站点、网站都会提供rss输出,你不用愁找不亮枝到你所感兴趣的东西来读。你能学到什么,只取决于你能坚持阅读多长时间。英语阅读这件事,干得好了,专门学英语下的功夫可以省了不说,你还能站在当代科技文化的前沿。
Papership:但凡科技类题材,无论入门读本、普通出版、学术内容、社区讨论,英文内容的质量都高过中文几百条街。离线阅读做笔记当然不成问题。双剑合璧,所向披靡。
Meerkat Reader:如果词汇量不大而又想啃一下英文原版书的话,推荐是因为这个App内置的查词功能非常方便,能极大减少因为生词而带来的阅读障碍,并且可以从Gutenberg等图书源下载免费书籍。
Economist:每周一期,可读性、热点、趣味性、知识性结合得登峰造极。一开始你可以先只读自己最感兴趣的内容,比如:关于中国,或者关于互联网,培养阅读新春迅闻的习惯。网站与App通用。
为什么“下拉刷新”没有成为移动应用的标准功能
下拉刷新这种用户交互最早由twitter创始人洛伦•布里切特(Loren Brichter)发明,有理论认为,下拉刷新是一种适用于按照从新到旧的时间顺序排列feeds的应用,在这种应用场景中看完旧的内容时,用户会很自然地下拉查找更新的内容,因此下拉刷新就显得非常合理。大家可以参考这篇文章:有趣的下拉刷新,下面我贴出一个有趣的下拉刷新的案例。
2. 实现原理
上面这些例子,外观做得再好看,他告谈的本质上都一样,那就是一个下拉刷新控件通常由以下几部分组成:
【1】Header
Header通常有下拉箭头,文字,进度条等元素,根据下拉的距离来改变它的状态,从而显示不同的样式
【2】Content
这部分是内容区域,网上有很多例子都是直接在ListView里面添加Header,但这就有局限性,因为好多情况下并不一定是用ListView来显示数据。我们把要显示内容的View放置在我们的一个容器中,如果你想实现一个用ListView显示数据的下拉刷新,你需要创建一个ListView旋转到我的容器中。我们处理这个容器的事件(down, move, up),如果向下拉,则把整个布局向下滑动,从而把header显示出来。
【3】Footer
Footer可以用来显示向上拉的箭头,自动加载更多的进度条等。
关于上图,需要说明几点:
1、这个布局扩展于LinearLayout,垂直排列
2、从上到下的顺序是:Header, Content, Footer
3、Content填充满父控件,通过设置top, bottom的padding来使Header和Footer不可见,也就是让它超出屏幕外
4、下拉时,调用scrollTo方法来将整个布局向下滑动,从而把Header显示出来,上拉正好与下拉相反。
5、派生类需要实现的是:将Content View填充到父容器中,比如,如果你要使用的话,那么你需要把ListView, ScrollView, WebView等添加到容器中。
6、上图中的红色袜慧碰区域就是屏的大小(严格来说,这里说屏幕大小并不准确,应该说成内容区域更加准确)
3. 具体实现
明白了实现原理与过程,我们尝试来具体实现,首先,为了以后更好地扩展,设计更加合理,我们把下拉刷新的功能抽象成一个接口:
1、IPullToRefreshT extends View
它具体的碧盯定义方法如下:
[java] view plain copy
public interface IPullToRefreshT extends View {
public void setPullRefreshEnabled(boolean pullRefreshEnabled);
public void setPullLoadEnabled(boolean pullLoadEnabled);
public void setScrollLoadEnabled(boolean scrollLoadEnabled);
public boolean isPullRefreshEnabled();
public boolean isPullLoadEnabled();
public boolean isScrollLoadEnabled();
public void setOnRefreshListener(OnRefreshListenerT refreshListener);
public void onPullDownRefreshComplete();
public void onPullUpRefreshComplete();
public T getRefreshableView();
public LoadingLayout getHeaderLoadingLayout();
public LoadingLayout getFooterLoadingLayout();
public void setLastUpdatedLabel(CharSequence label);
}
这个接口是一个泛型的,它接受View的派生类,因为要放到我们的容器中的不就是一个View吗?
2、PullToRefreshBaseT extends View
这个类实现了IPullToRefresh接口,它是从LinearLayout继承过来,作为下拉刷新的一个抽象基类,如果你想实现ListView的下拉刷新,只需要扩展这个类,实现一些必要的方法就可以了。这个类的职责主要有以下几点:
处理onInterceptTouchEvent()和onTouchEvent()中的事件:当内容的View(比如ListView)正如处于最顶部,此时再向下拉,我们必须截断事件,然后move事件就会把后续的事件传递到onTouchEvent()方法中,然后再在这个方法中,我们根据move的距离再进行scroll整个View。
负责创建Header、Footer和Content View:在构造方法中调用方法去创建这三个部分的View,派生类可以重写这些方法,以提供不同式样的Header和Footer,它会调用createHeaderLoadingLayout和createFooterLoadingLayout方法来创建Header和Footer创建Content View的方法是一个抽象方法,必须让派生类来实现,返回一个非null的View,然后容器再把这个View添加到自己里面。
设置各种状态:这里面有很多状态,如下拉、上拉、刷新、加载中、释放等,它会根据用户拉动的距离来更改状态,状态的改变,它也会把Header和Footer的状态改变,然后Header和Footer会根据状态去显示相应的界面式样。
3、PullToRefreshBaseT extends View继承关系
这里我实现了三个下拉刷新的派生类,分别是ListView、ScrollView、WebView三个,它们的继承关系如下:
关于PullToRefreshBase类及其派和类,有几点需要说明:
对于ListView,ScrollView,WebView这三种情况,他们是否滑动到最顶部或是最底部的实现是不一样的,所以,在PullToRefreshBase类中需要调用两个抽象方法来判断当前的位置是否在顶部或底部,而其派生类必须要实现这两个方法。比如对于ListView,它滑动到最顶部的条件就是第一个child完全可见并且first postion是0。这两个抽象方法是:
[java] view plain copy
/**
* 判断刷新的View是否滑动到顶部
*
* @return true表示已经滑动到顶部,否则false
*/
protected abstract boolean isReadyForPullDown();
/**
* 判断刷新的View是否滑动到底
*
* @return true表示已经滑动到底部,否则false
*/
protected abstract boolean isReadyForPullUp();
创建可下拉刷新的View(也就是content view)的抽象方法是
[java] view plain copy
/**
* 创建可以刷新的View
*
* @param context context
* @param attrs 属性
* @return View
*/
protected abstract T createRefreshableView(Context context, AttributeSet attrs);
4、LoadingLayout
LoadingLayout是刷新Layout的一个抽象,它是一个抽象基类。Header和Footer都扩展于这个类。这类抽象类,提供了两个抽象方法:
getContentSize
这个方法返回当前这个刷新Layout的大小,通常返回的是布局的高度,为了以后可以扩展为水平拉动,所以方法名字没有取成getLayoutHeight()之类的,这个返回值,将会作为松手后是否可以刷新的临界值,如果下拉的偏移值大于这个值,就认为可以刷新,否则不刷新,这个方法必须由派生类来实现。
setState
这个方法用来设置当前刷新Layout的状态,PullToRefreshBase类会调用这个方法,当进入下拉,松手等动作时,都会调用这个方法,派生类里面只需要根据这些状态实现不同的界面显示,如下拉状态时,就显示出箭头,刷新状态时,就显示loading的图标。
可能的状态值有:RESET, PULL_TO_REFRESH, RELEASE_TO_REFRESH, REFRESHING, NO_MORE_DATA
我们可以随意地制定自己的Header和Footer,我们也可以实现如图一和图二中显示的各种下拉刷新案例中的Header和Footer,只要重写上述两个方法getContentSize()和setState()就行了。HeaderLoadingLayout,它默认是显示箭头式样的布局,而RotateLoadingLayout则是显示一个旋转图标的式样。
5、事件处理
我们必须重写PullToRefreshBase类的两个事件相关的方法onInterceptTouchEvent()和onTouchEvent()方法。由于ListView,ScrollView,WebView它们是放到PullToRefreshBase内部的,所在事件先是传递到PullToRefreshBase#onInterceptTouchEvent()方法中,所以我们应该在这个方法中去处理ACTION_MOVE事件,判断如果当前ListView,ScrollView,WebView是否在最顶部或最底部,如果是,则开始截断事件,一旦事件被截断,后续的事件就会传递到PullToRefreshBase#onInterceptTouchEvent()方法中,我们再在ACTION_MOVE事件中去移动整个布局,从而实现下拉或上拉动作。
6、滚动布局(scrollTo)
如图三的布局结构可知,默认情况下Header和Footer是放置在Content View的最上面和最下面,通过设置padding来让他跑到屏幕外面去了,如果我们将整个布局向下滚动(scrollTo)一定距离,那么Header就会被显示出来,基于这种情况,所以在我的实现中,最终我是调用scrollTo来实现下拉动作的。
总的说来,实现的重要的点就这些,具体的一些细节在实现在会碰到很多,可以参考代码。
4. 如何使用
使用下拉刷新的代码如下
[java] view plain copy
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPullListView = new PullToRefreshListView(this);
setContentView(mPullListView);
// 上拉加载不可用
mPullListView.setPullLoadEnabled(false);
// 滚动到底自动加载可用
mPullListView.setScrollLoadEnabled(true);
mCurIndex = mLoadDataCount;
mListItems = new LinkedListString();
mListItems.addAll(Arrays.asList(mStrings).subList(0, mCurIndex));
mAdapter = new ArrayAdapterString(this, android.R.layout.simple_list_item_1, mListItems);
// 得到实际的ListView
mListView = mPullListView.getRefreshableView();
// 绑定数据
mListView.setAdapter(mAdapter);
// 设置下拉刷新的listener
mPullListView.setOnRefreshListener(new OnRefreshListenerListView() {
@Override
public void onPullDownToRefresh(PullToRefreshBaseListView refreshView) {
mIsStart = true;
new GetDataTask().execute();
}
@Override
public void onPullUpToRefresh(PullToRefreshBaseListView refreshView) {
mIsStart = false;
new GetDataTask().execute();
}
});
setLastUpdateTime();
// 自动刷新
mPullListView.doPullRefreshing(true, 500);
}
这是初始化一个下拉刷新的布局,并且调用setContentView来设置到Activity中。
在下拉刷新完成后,我们可以调用onPullDownRefreshComplete()和onPullUpRefreshComplete()方法来停止刷新和加载
5. 运行效果
这里列出了demo的运行效果图。
6. 源码下载
实现这个下拉刷新的框架,并不是我的原创,我也是参考了很多开源的,把我认为比较好的东西借鉴过来,从而形成我的东西,我主要是参考了下面这个demo:
这个demo写得不错,不过他这个太复杂了,我们都知道,一旦复杂了,万一我们要添加一些需要,自然也要费劲一些,我其实就是把他的简化再简化,以满足我们自己的需要。
月亮女孩什么意思
月亮女孩(Moon Girl )是美国漫威漫画旗下人物信孝,初次登场于《月亮女孩激弯与恶魔恐龙》第1期(2016年1月)。由Amy Reeder、Brandon Montclare和Natacha Bustos联合创造。本名卢聂拉·拉法耶特(Lunella Lafayette),是一个出色的小女孩,住在下曼哈顿东滑铅稿区。她的学生在公立学校20 Anna Silver经常嘲笑她,并称她的名字像「月亮女孩」,因为她的卓越的智力往往使她遐想和发明奇怪的小工具。
关于reeder是谁发明的和e的发明者的介绍到此就结束了,不知道你从中找到你需要的知识了吗?如果你还想了解更多百科问答相关的内容,记得收藏关注本站。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。
评论