文档章节

scaloid开发android

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

精选30+云产品,助力企业轻松上云!>>>

本篇文章被重新写了一遍,基本上一篇文章写完后,过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
粉丝 11
博文 37
码字总数 31191
作品 0
烟台
私信 提问
加载中
此博客有 3 条评论,请先登录后再查看。
Ubuntu13.10上android+idea+scala+sbt环境搭建

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

谦谦君子
2013/11/28
932
0
使用sbt scaloid构建编写android程序

scala是一种面向对象的运行在jvm上的函数式语言,它可以很大程度缩减代码长度,它和原生java程序几乎兼容,所以也可以和java程序混写.也意味着可以用它来写android程序. 为了更好的使用scala的特...

firefoxmmx
2013/11/05
254
0
Android Scala IDEA 环境

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

lost_o0
2014/06/08
1.8K
0
scala/scaloid

Simpler Android Scaloid is a library that simplifies your Android code. It makes your code easy to understand and maintain by leveraging Scala language. For example, the code bl......

scala
2016/02/04
0
0
Android组件及UI框架大全

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

千山万水
2015/07/13
228
0

没有更多内容

加载失败,请刷新页面

加载更多

垂直对齐div中的文本[复制] - Vertically align text within a div [duplicate]

问题: This question already has an answer here: 这个问题在这里已有答案: How do I vertically align text in a div? 如何在div中垂直对齐文本? 29 answers 29个答案 The code below (......

javail
39分钟前
22
0
OSChina 周一乱弹 —— 南方水到底多深

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: Various Artists-用印度乐器演奏苏联国歌(洛天侬 remix) 手机党少年们想听歌,请...

小小编辑
48分钟前
56
0
动态规划:LC121.买卖股票的最佳时机

题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你...

曦鱼violet
55分钟前
18
0
快递100云平台的安全措施--API限流

2、热点参数限流 注意: 若 entry 的时候传入了热点参数,那么 exit 的时候也一定要带上对应的参数(exit(count, args)),否则可能会有统计错误。 3、通过 ParamFlowRuleManager 的 loadRu...

bykk
今天
19
0
在Bash中重定向stderr和stdout - Redirect stderr and stdout in Bash

问题: I want to redirect both stdout and stderr of a process to a single file. 我想将一个进程的stdout和stderr都重定向到一个文件。 How do I do that in Bash? 我该如何在Bash中做到...

富含淀粉
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部