文档章节

scaloid开发android

lost_o0
 lost_o0
发布于 2014/06/23 23:01
字数 1363
阅读 583
收藏 4

本篇文章被重新写了一遍,基本上一篇文章写完后,过20天后,就发现以前的观点站不住脚了。

scaloid强大的表现力

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="wrap_content" android:padding="20dip">
    <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content" android:text="Sign in"
            android:layout_marginBottom="25dip" android:textSize="24.5sp"/>
    <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content" android:text="ID"/>
    <EditText android:layout_width="match_parent"
            android:layout_height="wrap_content" android:id="@+id/userId"/>
    <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content" android:text="Password"/>
    <EditText android:layout_width="match_parent"
            android:layout_height="wrap_content" android:id="@+id/password"
            android:inputType="textPassword"/>
    <Button android:layout_width="match_parent"
            android:layout_height="wrap_content" android:id="@+id/signin"
            android:text="Sign in"/>
    <LinearLayout android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <Button android:text="Help" android:id="@+id/help"
                android:layout_width="match_parent" android:layout_height="wrap_content"/>
        <Button android:text="Sign up" android:id="@+id/signup"
                android:layout_width="match_parent" android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

is reduced to

new SVerticalLayout {
  STextView("Sign in").textSize(24.5 sp).<<.marginBottom(25 dip).>>
  STextView("ID")
  SEditText()
  STextView("Password")
  SEditText() inputType TEXT_PASSWORD
  SButton("Sign in")
  this += new SLinearLayout {
    SButton("Help")
    SButton("Sign up")
  }
}.padding(20 dip)

以上摘自scaloid github主页,是不是被其简洁性打动了呢,不管你有没有,至少我是心动的不行了。于是乎,这几天将 《疯狂android讲义》前面关于UI组件讲解的几个重点例子,用scaloid翻译了一遍。然后,现实告诉我们,简洁是有代价的...

activity初始化模版

class clazzName extends SActivity{activity=>
    lazy val comp1= new SUIComponent().styles//...
    lazy val comp2= new SUIComponent().styles//...
    onCreate{
        contentView = new SUILayout{
            this+=com1.<<.layoutStyles.>>
            this+=com1.<<.layoutStyles.>>
        }
        comp1.onClick{(_:android.widget.AdapterView[_], _:android.view.View,position: Int, _:Long)=>
            //todo
        }
    }
}

这基本就是我关于UI初始化的标准模版了(你也可以将lazy val换成var )。至于为什么不将layoutStyles写在声明后面,则是由于scaloid关于UI组件的实现都是继承与原生android api,并使用了的隐式转换(implicit context:Context) 来简化代码量。而渲染效率呢,则和用xml写布局的没什么区别。
这时,便出现了第一个问题:到底使用xml写view还是说用代码写view?

虽然最近一直在用代码写view,熟悉id,在实际生产环境下,我更倾向于使用后者,原因如下:

  • java和scala之间切换更容易

  • scala编译速度真的很慢

  • 可以直接通过可视化工具生成xml(据我了解,有不少android程序员都是通过拖拽来实现布局的)

  • 减少progurd配置

写view组件

当你要开发view组件时,最好参照scaloid已经写好的组件。例如你要实现一个View,最好时继承scaloid的 TraitView,这样你才能拥有一些简便的api。还有一些构造函数等问题,基本上照着scaloid源码来,基本上没啥大问题。

scaloid资料

scaloid的网络资源真心不丰富,github上的readme+官方blog几乎就是所有资料了。很多api都没有覆盖到,基本上你要用到哪里,就要去扒一下源码才可以。我在里碰到的问题呢,是说,一些java原生api(例如 SimpleArrayAdapter)是不支持scala集合的?

这里的解决方案:

  1. 集合等api全部使用java原生的

  2. 使用scala集合,然后进行类型转换

  3. 摒弃掉java原生api,使用scaloid提供的或者自己封装

以上方案,用第一种,就真心没必要使用scala语言了,直接java写会更省劲;第二种,最好自己封装一些隐式转换加快开发;第三种,初期比较痛苦,得查scaloid api以及看源码,才能掌握好用法,往后发展的话,还是蛮ok的。


scaloid和proguard

貌似只要和scala占上边的就没有什么是简单的,不管是scala的类型系统还是sbt build工具,每一个都需要花大量的时间来入门。当scala与android结合时,更是如此。

当你用scala开发android正爽的时候,突然发现编译报 classNotFound 的错误,而产生这个问题根源则是proguard剪切代码带来的,如果你懒的解决这个问题呢,可以直接sbt 运行 clean  android:run 指令。如果要想好好的解决这个问题呢,推荐看看douban-android项目的以proguard开头的两个配置文件。


scaloid对原有api的简化

除了view组件的api进行简化外,还对log,ui更新等做了简化,简化后,用起来真心舒适,github上关于简化的讲解,基本能让你上手使用。代码量有大幅的减少。

遇到的小坑

与其说是小坑,倒不如说时对api的掌握程度不够造成的。将小坑记录在这里

//颜色转换
new ColorDrawable(Color.parseColor("#F00000"))

//动画效果  
AnimationUtils.loadAnimation(context,android.R.anim.fade_out)

还有一些是java和scala混用带来的一些问题,这里就不做赘述了,如果真想用scala做开发的话,就尽量减少直接调用原生java api的机会。还有就是scala开发和java开发还是有很多细节上的不同,一些思维上还是要做一些转变的,现在用scaloid写的开源的android真心少,开发技巧更多还是从一些后台代码中学习吧。

小结

总的来讲,除了一贯的编译速度慢以外,用scala开发android,对源码的阅读和学习能力要求还是蛮高的,如果没有真正的需求或者能跟得上技术的团队的话,还是用java开发好一点,简单即效率。


© 著作权归作者所有

共有 人打赏支持
lost_o0
粉丝 10
博文 37
码字总数 31139
作品 0
烟台
加载中

评论(3)

中成才
中成才
玩 Scala 的握个爪:dog:
感觉太煽情
感觉太煽情
看了下,本打算学学的,发现学习时间成本太高。
飞扬的风
cool
Ubuntu13.10上android+idea+scala+sbt环境搭建

首先声明,开发android,不是一定要使用ADT或者AndroidStudio等google提供的IDE,其实这两个也就是分别在eclipse和Idea上装了相应的插件而已。唯一需要的就是SDK而已,甚至模拟器都可以不需要...

谦谦君子
2013/11/28
0
0
Android Scala IDEA 环境

最近想搞android,scala又是我比较喜欢的语言,于是乎,就想搞个他们的结合体。 搞这个环境被折磨了好久,从下载android sdk到IDE,再到版本兼容,基本上能碰到的问题都碰了个遍。 先说andro...

lost_o0
2014/06/08
0
0
Android组件及UI框架大全

Android 是目前最流行的移动操作系统(还需要加之一吗?)。 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件。 本文试图将目前流行...

千山万水
2015/07/13
0
0
Android组件及UI框架大全

Android 是目前最流行的移动操作系统(还需要加之一吗?)。 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件。 本文试图将目前流行...

千山万水
2015/07/13
0
4
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊
06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring IOC实现原理

1、BeanDefinition 对依赖翻转模式中管理对象依赖关系的数据抽象 实现依赖翻转功能的核心数据结构 依赖翻转功能都是围绕对BeanDefinition 处理完成的 有了这些BeanDefinition 基础数据结构,...

职业搬砖20年
11分钟前
0
0
Python判断变量的数据类型的两种方法

1、isinstance(变量名,类型) def varargsql(self, sql, *args): if isinstance(args, tuple): self.cursor.execute(sql, args) self.conn.commit() 2、通过与其他已......

fang_faye
12分钟前
0
0
xml 转义特殊字符

XML中共有5个特殊的字符,分别是:&<>“’。如果配置文件中的注入值包括这些特殊字符,就需要进行特别处理。有两种解决方法:其一,采用本例中的特殊标签,将包含特殊字符的字符串封装起来;...

inidcard
13分钟前
0
0
Mysql中哪些sql 不会走索引

1. 索引列参与了计算 SELECT `sname` FROM `stu` WHERE `age`+10=30; 2. 索引使用了函数运算 SELECT `sname` FROM `stu` WHERE LEFT(`date`,4) <1990; 3. like SELECT * FROM `houdunwang` W......

ChyiHuang
22分钟前
1
0
nginx 504 Gateway Time-out

打开nginx.config: 参数介绍: #设定http服务器http{include mime.types; #文件扩展名与文件类型映射表default_type application/octet-stream; #默认文件类型#charset utf-8; #默...

lyle_luo
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部