RatingBar的实现
最近在做有关这方面的东西,所以,也对这东西有一定的了解。说真的,android这些组件的学习其实不难,难就在于你能够自由的设计自己想要的样式出来,因为这里面有很多限制的东西。而且,作为一名android新手,我开始有一些顿悟了,android这东西到底该怎么弄,已经开始有自己的一些想法。我认为,当你开始要接触一些新的组件或其他东西时,首先,一定要搜到开源的代码,最好是别人有放图上来的那种,而且最好是要有好几种不同的实现代码,就算是同样的实现代码,还是要找到不同实现图样的。因为我们要进行对比,有些人的实现方案可能太过于复杂,或者是因为它的实现是因为有其他相关东西的关联才会写出那样的代码,因为他还需要实现其他东西,但是我们很可能只是仅仅要实现基本样式而已。单是看他们的代码是很难看懂的,说真的,我就真的看得很辛苦,所以,我干脆就看看它们能够在我的机器上实现出来,然后再看看哪些代码是不必要的,哪些地方的改动会产生什么影响,这些都能通过改动他们的代码然后与他们的实现图进行对比就能看出来。这种学习对于我来说比较直观,至少我可以自己引起变化并进行观察。当然有一种学习程序的说法就是当你理解了别人的代码后,要自己再重新敲一遍,看看自己的代码与别人的有什么不同。这种做法固然是对的,但是我认为,就android这方面的学习来说,是不需要这种做法的,因为它里面真的已经那个为我们提供了很多东西,像是一些很实用的接口,所以,我们更多是要懂得如何利用这些接口来为我们的需要服务。所以,我们需要明白的就是,当我想要某种效果时,我可以使用那些接口,这些接口的使用有什么需要注意的地方等等,至于它里面的方法,我们是可以通过文档来查看的,但是我们还是要知道一些基本的方法,毕竟每次使用时都要查看文档还是很烦的,哪怕你手头上就有。外面总是有些人会说,要想成为android达人,就必须精通这个那个一堆根本就是你花个半年一年也不能拿下来的东西,是的,成为达人,是要全面懂得android的,但是,真的有必要吗?一个android开发人员真的是要学会这些才开始入手吗?我觉得,不需要,因为android里面的东西真的不是什么语法特性,它就是一系列的接口和方法,就算你的java并不是多牛,你也可以开始做android,因为就我认识的人中,就有一个是通过android来学习java的,现在他也能在一家开发公司里成为开发核心(虽然是一家小公司),所以,请放开胆子的做android的东西,不懂的东西多查多想多实践,当然,你也必须进修一些东西,像是java等等,但是这些都是可以同步进行的,将你学的东西在实践中亲自试试不是更好吗? 接下来就是正题,那就是对于RatingBar,我到底想要做些什么。一般都有这样的需求: 1.怎样实现一个RatingBar.这是一个很基本的问题,实现不出来,那么其他的东西自然不用说了,而且里面是有一个附加的子问题,就是我要实现一个RatingBar,到底需要的是什么。这个问题其实是上面问题的另一种问法,但还是要提出来。为什么呢?因为网上教程它们实现的RatingBar的样式是各种各样的,但是我如果需要的仅仅只是一个默认样式的呢?根本就不需要那么麻烦啊!所以,这点还是很有知道的必要的。 2.如果我想要我的RatingBar实现各种效果,比如说,大小,颜色,位置,甚至是样式,我该怎么办?这个问题是我们经常遇到的,因为就像我上面说过的,android组件更多的问题都是因为我们不满足默认而想要自己定义的,而这些,都可以通过RatingBar的一些方法或布局设置来实现。 3.RatingBar与其他组件的搭配使用,这就是组件的组合问题。这个问题是很常见的,因为我们在实际设计东西时,几种组件经常是要按我们想要的方式组合在一一起,而且,要命的是,这种组合有时是会出现问题的,因为组件或布局间的兼容问题吧。这些问题有时候是很烦的,甚至是会让人崩溃的。好吧,我承认,像我这样的新手,就经常崩溃! 既然问题已经罗列出来,那么,现在就是就着这些问题一条一条解决了。 一.RatingBar的基本实现: 要实现一个基本的RatingBar,其实并不复杂,就是需要一个布局,这个布局再添加RatingBar这个组件就行。如:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" ><RatingBar android:id="@+id/ratingBar" android:layout_height="wrap_content" android:layout_width="wrap_content" android:rating = "3.5" android:numStars="5" android:stepSize = "0.5"/></LinearLayout>
接着就是activity的代码:
@SuppressWarnings("unused") private RatingBar ratingBar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar);
效果图如下:
这里,就对布局文件上几个属性进行说明,因为这是我们构建RatingBar必须要了解的,而且还是我们需要修改的。这里,就要提示各位,如果你的布局中有RatingBar,那么你的layout_width和layout_height最好要设置成wrap_content,至少layout_width是必须这么做的,因为如果没有这么做,那么很可能你的星星显示不出来,当然,你可以修改一下星星的大小,就可以显示更多的星星。那么,接下来,就是介绍RatingBar中的相关属性。
android:rating = "3.5",这一条是设置默认的分数,可以是浮点数,因为我们的RatingBar其实是评分条,所以星星的数量其实就是用来显示分数的数量,而默认的分数就是应用一开始出现的星星的数量。
android:numStars="5",这个是设置显示的星星数量,理论上,是任何整数都可以,但是我的建议就是最好就是5,因为如果多于5的话,我试过,就我的手机,3.7寸大的屏幕,最多只能显示5.8,为什么是这么怪的数据,因为那个第六个星星根本就还有一角没有显示出来。
android:stepSize = "0.5“,这是显示步长的。什么是步长,就是当你的分数增加时,是按照多大的分数增加的,就像这里,步长是0.5,那么你的手机上显示的星星是可以用你的手指点击来增加分数的,而这里就会按照一次点击增加0.5的步长,就是半颗星星。
但是,这里有点必须要注意,就是我们有时候,不,应该是大部分情况,都不希望我们的RatingBar是可以改动的,是固定的显示分数的,那么,这时我们应该怎样做呢?就是再增加一条属性,就是android:isIndicator="true",这样分数就会固定,不会改变,所以,步长的设定就完全没有必要。
当然,上面的某些属性也是有相应的方法是可以更改的,但是一般情况下都是不需要修改的,如果你的设计需要的话,可以看一下文档,里面有介绍,那么我这里就不多说了。
上面的代码已经可以定义一个基本样式的RatingBar了,所以第一个问题基本上已经解决了,那么,接下来就是第二个问题:
二.RatingBar样式的修改
很多时候,默认的RatingBar并不能满足我们的要求,因为我们的应用的需求是各种各样的,默认的样式实在是太过于单调了。这时就需要修改RatingBar的属性了。一般而言,我们都只会修改RatingBar的大小,图样,颜色,等等。所以,这里我就只挑几种比较常见的,就是上面说到的三种。
1.大小。
默认的RatingBar的星星大小,老实说,实在太大了,因为有时候我们呢,会想要将RatingBar放在其他组件上,如ListView,所以,默认的大小肯定不符合我们的要求。那么,我们需要将星星变小一点,于是就需要在RatingBar的布局中添加这么一句:style="?android:attr/ratingBarStyleSmall"这样,星星的大小就会变小,效果图如下:
很抱歉,就我目前收集到的资料来看,星星的大小就只有默认和变小这两种模式,没有其他的情况,但是就我目前的使用情况来说,已经足够了,如果你们有其他要求,那么,我的建议就是换掉默认的星星图案吧。
接下来就是颜色和图样的改变。为什么这两条要放在一块讲呢?因为这两条的修改就是自定义自己的RatingBar,所谓的自定义,其实就是用自己的图样换掉默认的图案,这样是最好的情况,因为包括大小,颜色等等你都能使用自己满意的样式。因为我实在是没有找到什么相关的方法和资料能够解决这个问题,基本上,网上都是选择替换掉图案,因为系统中的星星的图案是固定的,它就只是一张图片而已,所以应该真的是没法用代码进行修改。应该吧?因为以后可能就不一样了吧。方法如下:
2.RatingBar的自定义设置:
我们还是要在我们的RatingBar的布局中添加这么一句:style="@style/myRatingBar",然后就是开始创建我们的myRatingBar的xml文件了。在res/values目录下创建一个xml文件,然后下面是代码:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="MyRatingBar" parent="@android:style/Widget.RatingBar"> <item name="android:progressDrawable">@drawable/myRatingBar</item> <item name="android:minHeight">15dip</item> <item name="android:maxHeight">15dip</item> </style> </resources>
item name="android:minHeight"和item name="android:maxHeight"可以自己定义自己的RatingBar的大小。
接着是在res/drawable下创建我们的myRatingBar.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+android:id/background" android:drawable="@drawable/rating" /> <item android:id="@+android:id/progress" android:drawable="@drawable/rating_show" /> </layer-list>
这里面,第一个item是设置背景图案的,第二个item是设置RatingBar图案的。
到了这里,基本上的设置已经搞定了,我们可以自定义属于自己的RatingBar了。由于本人手上没有什么图片资源,所以,就贴别人的效果图出来吧,如果有得罪该图的作者的话,还请见谅啊。
接下来就是RatingBar与其他组件的搭配。这方面,就以我自己的东西为例好了,就是在ListView上显示RatingBar,这个需求是非常常见的。
三。ListView上显示RatingBar
对于这个,很多人都会选择自定义ListView的适配器,但是经过我的查找,发现是可以不用这么麻烦的(当然,自定义也不是很麻烦,如果你要处理的组件很多的话,那么自定义的确是很好的选择,但是这里我就不讲了,因为我这里的前提就是默认大家只是想我一样,只想在ListView上显示RatingBar,那么就没有必要那么麻烦,就像我当初做的一样)。下面就直接贴出代码:
public class RatingBarActivity extends Activity { /** Called when the activity is first created. */ private RatingBar ratingBar; private ListView list; private List<Map<String, Object>> data; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ratingBar = (RatingBar) findViewById(R.id.ratingBar); list = (ListView) findViewById(R.id.list); data = getData(); SimpleAdapter adapter = new SimpleAdapter(this, this.data, R.layout.item, new String[] { "book", "rating" }, new int[] { R.id.book, R.id.ratingBar }); adapter.setViewBinder(new SimpleAdapter.ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { if ((view instanceof RatingBar) && (data instanceof Float)) { ratingBar = (RatingBar) view; ratingBar.setRating((Float) data); return true; } return false; } }); list.setAdapter(adapter); } private List<Map<String, Object>> getData() { Map<String, Object> map = new HashMap<String, Object>(); List<Map<String, Object>> mlist = new ArrayList<Map<String, Object>>(); String book = "安卓应用"; map.put("book", book); map.put("rating", Float.parseFloat(3 + "")); mlist.add(map); return mlist; }}
然后是要有两个布局文件,一个是main.xml,如:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" ><ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView></LinearLayout>
另一个就是存放布局组件的xml文件,像是RatingBar, TextView,反正就是你想要放在ListView上的组件最好单独放在一个xml文件中,如:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_margin="5dp"> <TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:collapseColumns="2" android:stretchColumns="1"> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/book" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp"/> <RatingBar android:id="@+id/ratingBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:paddingTop="5dp" android:numStars="5" style="?android:attr/ratingBarStyleSmall"/> </TableRow> </TableLayout> </LinearLayout></LinearLayout>
效果图如:
至此,全文就结束了。当然,我承认,里面有些东西我根本就没有讲清楚,像是最后一个,我只是贴代码出来,但是我认为那根本就没啥好讲的,因为如果是里面的一些方法,就像ListView的适配器的设置,或者像是TableLayout这些东西,但是,我觉它们没有什么可讲的,为什么呢?只要上网搜一下,你就能得到有关于它们的更多详细信息,然而,这里的重点并不是讲这些东西到底是什么,而是告诉大家,怎样做,所以,根本就不需要费尽心思去向别人讲一些其他东西,有关这些东西,我会放在其他地方讲的。也希望我的这篇文章能够对某些人有用,因为正如我前面所讲的,我写博客,单纯只是给自己看,整理自己所想的,所做过的,所以并不会过多的去考虑读者能够看懂或者要尽可能的详细,相信大家也不会对我这个新手抱有太大的期望吧。
更多相关文章
- 模拟来电的实现
- Android(安卓)对应用进行单元测试
- Android如何在局域网中发送网络广播
- 哥哥手把手教你认识AIDL的详细使用,来了老弟
- Android(安卓)invalidate与postInvalidate用法
- Andriod 实现可拖动列表
- android之listview使用方法(一)
- android 内存优化 性能优化
- react-native webView android使用本地html问题