Skip to content

界面

5735字约19分钟

2024-05-28

标题栏(ActionBar)

--部分常用API
show:显示
hide:隐藏
Elevation:设置阴影
BgroundDrawable:设置背景
DisplayHomeAsUpEnabled(boolean):设置是否显示返回图标



--设置标题
activity.ActionBar.setTitle('大标题')
activity.ActionBar.setSubTitle("小标题")

--设置ActionBar背景颜色
import "android.graphics.drawable.ColorDrawable"
activity.ActionBar.setBackgroundDrawable(ColorDrawable(Color))

--自定义ActionBar标题颜色
import "android.text.SpannableString"
import "android.text.style.ForegroundColorSpan"
import "android.text.Spannable"
sp = SpannableString("标题")
sp.setSpan(ForegroundColorSpan(0xff1DA6DD),0,#sp,Spannable.SPAN_EXCLUSIVE_INCLUSIVE)
activity.ActionBar.setTitle(sp)

--自定义ActionBar布局
DisplayShowCustomEnabled(true)
CustomView(loadlayout(layout))


--ActionBar返回按钮
activity.ActionBar.setDisplayHomeAsUpEnabled(true)
--自定义返回按钮图标
activity.ActionBar.setHomeAsUpIndicator(drawable)


--菜单
function onCreateOptionsMenu(menu)
  menu.add("菜单1")
  menu.add("菜单2")
  menu.add("菜单3")
end
function onOptionsItemSelected(item)
  print("你选择了:"..item.Title)
end





--Tab导航使用
import "android.app.ActionBar$TabListener"
actionBar=activity.ActionBar
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
tab = actionBar.newTab().setText("Tab1").setTabListener(TabListener({
  onTabSelected=function()
    print"Tab1"
  end}))
tab2=actionBar.newTab().setText("Tab2").setTabListener(TabListener({
  onTabSelected=function()
    print"Tab2"
  end}))
actionBar.addTab(tab)
actionBar.addTab(tab2)

五大布局

--Android中常用的5大布局方式有以下几种:
--线性布局(LinearLayout):按照垂直或者水平方向布局的组件。
--帧布局(FrameLayout):组件从屏幕左上方布局组件。
--表格布局(TableLayout):按照行列方式布局组件。
--相对布局(RelativeLayout):相对其它组件的布局方式。
--绝对布局(AbsoluteLayout):按照绝对坐标来布局组件。


1.线性布局(LinearLayout)
线性布局是Android开发中最常见的一种布局方式,它是按照垂直或者水平方向来布局,通过orientation属性可以设置线性布局的方向。属性值有垂直(vertical)和水平(horizontal)两种。
常用的属性:
orientation:可以设置布局的方向
gravity:用来控制组件的对齐方式
layout_weight控制各个控件在布局中的相对大小,layout_weight的属性是一个非负整数值
线性布局会根据该控件layout_weight值与其所处布局中所有控件layout_weight值之和的比值为该控件分配占用的区域
--[[例如,在水平布局的LinearLayout中有两个Button,这两个Button的layout_weight属性值都为1,那么这两个按钮都会被拉伸到整个屏幕宽度的一半。如果layout_weight指为0,控件会按原大小显示,不会被拉伸.
对于其余layout_weight属性值大于0的控件,系统将会减去layout_weight属性值为0的控件的宽度或者高度,再用剩余的宽度或高度按相应的比例来分配每一个控件显示的宽度或高度]]


2.帧布局(FrameLayout)
帧布局是从屏幕的左上角(0,0)坐标开始布局,多个组件层叠排列,第一个添加的组件放到最底层,最后添加到框架中的视图显示在最上面。上一层的会覆盖下一层的控件。


3.表格布局(TableLayout
表格布局是一个ViewGroup以表格显示它的子视图(view)元素,即行和列标识一个视图的位置。
表格布局常用的属性如下:
collapseColumns:隐藏指定的列
shrinkColumns:收缩指定的列以适合屏幕,不会挤出屏幕
stretchColumns:尽量把指定的列填充空白部分
layout_column:控件放在指定的列
layout_span:该控件所跨越的列数


4.相对布局(RelativeLayout
相对布局是按照组件之间的相对位置来布局,比如在某个组件的左边,右边,上面和下面等。


5.绝对布局(AbsoluteLayout)
采用坐标轴的方式定位组件,左上角是(00)点,往右x轴递增,往下Y轴递增,组件定位属性为layout_x 和layout_y来确定坐标。

Widget(普通控件)

--Button(按钮控件)、TextView(文本控件)、EditText(编辑框控件)

常用API:
id.setText("文本")--设置控件文本
id.getText()--获取控件文本
id.setWidth(300)--设置控件宽度
id.setHeight(300)--设置控件高度


--点击事件
id.onClick=function()
print"你触发了点击事件"
end

--长按事件
id.onLongClick=function()
print"你触发了长按事件"
end



--图片控件(ImageView与ImageButton)
--设置图片
--布局表中用src属性就可以,如:src=图片路径,

--动态设置
id.setImageBitmap(loadbitmap(图片路径))
--设置Drawable对象
import "android.graphics.drawable.BitmapDrawable"
id.setImageDrawable(BitmapDrawable(loadbitmap(图片路径)))

--缩放,scaleType
--字段
CENTER    --按原来size居中显示,长/宽超过View的长/宽,截取图片的居中部分显示 
CENTER_CROP    --按比例扩大图片的size居中显示,使图片长(宽)等于或大于View的长(宽) 
CENTER_INSIDE  --完整居中显示,按比例缩小使图片长/宽等于或小于View的长/宽 
FIT_CENTER     --按比例扩大/缩小到View的宽度,居中显示 
FIT_END        --按比例扩大/缩小到View的宽度,显示在View的下部分位置 
FIT_START      --按比例扩大/缩小到View的宽度,显示在View的上部分位置 
FIT_XY         --不按比例扩大/缩小到View的大小显示 
MATRIX         --用矩阵来绘制,动态缩小放大图片来显示。 


--点击与长按事件同上

Check View(检查控件)

--CheckBox(复选框),Switch(开关控件),ToggleButton(切换按钮)
--直接判断是否选中然后执行相应事件即可
--判断API
check.isSelected()--返回布尔值


--RadioButton(单选按钮)与RadioGroup
--将RadioButton的父布局设定为RadioGroup然后绑定下面的监听即可
rp.setOnCheckedChangeListener{
  onCheckedChanged=function(g,c)
  l=g.findViewById(c)
  print(l.Text)
  end}

SeekBar(拖动条)

--绑定监听
seekbar.setOnSeekBarChangeListener{
onStartTrackingTouch=function()
--开始拖动
end,
onStopTrackingTouch=function()
--停止拖动
end,
onProgressChanged=function()
--状态改变
end}

--部分API
Progress--当前进度
Max--最大进度

ProgressBar(进度条)

--超大号圆形风格
style="?android:attr/progressBarStyleLarge"
--小号风格
style="?android:attr/progressBarStyleSmall"
--标题型风格
style="?android:attr/progressBarStyleSmallTitle"
--长形进度条
style="?android:attr/progressBarStyleHorizontal"

--部分API
max --最大进度值
progress --设置进度值
secondaryProgress="70" --初始化的底层第二个进度值

id.incrementProgressBy(5)
--ProgressBar进度值增加5
id.incrementProgressBy(-5)
--ProgressBar进度值减少5
id.incrementSecondaryProgressBy(5)
--ProgressBar背后的第二个进度条 进度值增加5
id.incrementSecondaryProgressBy(-5)
--ProgressBar背后的第二个进度条 进度值减少5

Adapter View(适配器控件)

--适配器控件主要包括(ListView,GridView,Spinner,ExpandableList等)

--想要动态为此类控件添加项目就必须得要依靠适配器!
--适配器使用
--AarrayAdapter(简单适配器)
--创建项目数组
数据={}
--添加项目数组
for i=1,100 do
table.insert(数据,tostring(i))
end
--创建适配器
array_adp=ArrayAdapter(activity,android.R.layout.simple_list_item_1,String(数据))
--设置适配器
lv.setAdapter(array_adp)


--LuaAdapter(Lua适配器)
--创建自定义项目视图
item={
  LinearLayout,
  orientation="vertical",
    layout_width="fill",
   {
    TextView,
    id="text",
    layout_margin="15dp",
    layout_width="fill"
  },
}
--创建项目数组
data={}
--创建适配器
adp=LuaAdapter(activity,data,item)
--添加数据
for n=1,100 do
  table.insert(data,{
    text={
      Text=tostring(n),          
    },    
  })
end
--设置适配器
lv.Adapter=adp


--以上的适配器ListView、Spinner与GridView等控件通用

--那么ExpandableListView(折叠列表)怎么办呢?
--别怕,安卓系统还提供了一个ArrayExpandableListAdapter来给我们使用,可以简单的适配ExpandableListView,下面给出实例

ns={
  "Widget","Check view","Adapter view","Advanced Widget","Layout","Advanced Layout",
}

wds={
  {"Button","EditText","TextView",
    "ImageButton","ImageView"},
  {"CheckBox","RadioButton","ToggleButton","Switch"},
  {"ListView","ExpandableListView","Spinner"},
  {"SeekBar","ProgressBar","RatingBar",
    "DatePicker","TimePicker","NumberPicker"},
  {"LinearLayout","AbsoluteLayout","FrameLayout"},
  {"RadioGroup","GridLayout",
    "ScrollView","HorizontalScrollView"},
}


mAdapter=ArrayExpandableListAdapter(activity)
for k,v in ipairs(ns) do
  mAdapter.add(v,wds[k])
end
el.setAdapter(mAdapter)
--这样就实现ExpandableListView项目的适配了




--当然AdapterView的事件响应也是与普通控件不同的。

--ListView与GridView的单击与长按事件
--项目被单击
id.onItemClick=function(l,v,p,i)
print(v.Text)
return true
end
--项目被长按
id.onItemLongClick=function(l,v,p,i)
print(v.Text)
return true
end


--Spinner的项目单击事件
id.onItemSelected=function(l,v,p,i) 
print(v.Text)
end

--ExpandableListView的父项目与子项目单击事件
id.onGroupClick=function(l,v,p,s)
print(v.Text..":GroupClick")
end

id.onChildClick=function(l,v,g,c)
print(v.Text..":ChildClick")
end

LuaWebView(浏览器控件)

--常用API
id.loadUrl("http://www.androlua.cn")--加载网页
id.loadUrl("file:///storage/sdcard0/index.html")--加载本地文件
id.getTitle()--获取网页标题
id.getUrl()--获取当前Url
id.requestFocusFromTouch()--设置支持获取手势焦点
id.getSettings().setJavaScriptEnabled(true)--设置支持JS
id.setPluginsEnabled(true)--支持插件
id.setUseWideViewPort(false)--调整图片自适应
id.getSettings().setSupportZoom(true)--支持缩放
id.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN)--支持重新布局
id.supportMultipleWindows()--设置多窗口
id.stopLoading()--停止加载网页


--状态监听
id.setWebViewClient{
shouldOverrideUrlLoading=function(view,url)
--Url即将跳转
 end,
onPageStarted=function(view,url,favicon)
--网页加载
end,
onPageFinished=function(view,url)
--网页加载完成
end}

AutoCompleteTextView(自动补全文本框)

--适配数据
arr={"Rain","Rain1","Rain2"};
arrayAdapter=LuaArrayAdapter(activity,{TextView,padding="10dp",textSize="18sp",layout_width="fill",textColor="#ff000000"}, String(arr))
actw.setAdapter(arrayAdapter)

Threshold=1--设置输入几个字符后才能出现提示

TimePicker(时间选择器)

--时间改变监听器
import "android.widget.TimePicker$OnTimeChangedListener"
id.setOnTimeChangedListener{
  onTimeChanged=function(view,,)
    print(时,分)
  end}

--部分API
=id.getCurrentHour()--获取小时
=id.getCurrentMinute()--获取分钟
id.setIs24HourView(Boolean(true))--设置24小时制

DatePicker(日期选择器)

id=dp
=id.getDayOfMonth()--获取选择的天数
=id.getMonth ()--获取选择的月份
=id.getYear()--获取选择的年份
id.updateDate(2016,1,1)--更新日期
print(年,月,日)

NemberPicker(数值选择器)

setMinValue(0)--设置最小值
setMaxValue(100)--设置最大值
setValue(50)--设置当前值
getValue()--获取选择的值
OnValueChangedListener--数值改变监听器

AlertDialog(对话框)

--常用API
.setTitle("标题")--设置标题
.setMessage("设置消息")--设置消息
.setView(loadlayout(layout))--设置自定义视图
.setPositiveButton("积极",{onClick=function() end})--设置积极按钮
.setNeutralButton("中立",nil)--设置中立按钮
.setNegativeButton("否认",nil)--设置否认按钮




--普通对话框
AlertDialog.Builder(this)
.setTitle("标题")
.setMessage("消息")
.setPositiveButton("积极",{onClick=function(v) print"点击了积极按钮"end})
.setNeutralButton("中立",nil)
.setNegativeButton("否认",nil)
.show()




--输入对话框
InputLayout={
  LinearLayout;
  orientation="vertical";
  Focusable=true,
  FocusableInTouchMode=true,
  {
    TextView;
    id="Prompt",
    textSize="15sp",
    layout_marginTop="10dp";
    layout_marginLeft="3dp",
    layout_width="80%w";
    layout_gravity="center",
    text="输入:";
  };
  {
    EditText;
    hint="输入";
    layout_marginTop="5dp";
    layout_width="80%w";
    layout_gravity="center",
    id="edit";
  };
};

AlertDialog.Builder(this)
.setTitle("标题")
.setView(loadlayout(InputLayout))
.setPositiveButton("确定",{onClick=function(v) print(edit.Text)end})
.setNegativeButton("取消",nil)
.show()
import "android.view.View$OnFocusChangeListener"
edit.setOnFocusChangeListener(OnFocusChangeListener{ 
 onFocusChange=function(v,hasFocus)
if hasFocus then
Prompt.setTextColor(0xFD009688)
end
end})



--下载文件对话框
Download_layout={
  LinearLayout;
  orientation="vertical";
  id="Download_father_layout",
  {
    TextView;
    id="linkhint",
    layout_marginTop="10dp";
    text="下载链接",
    layout_width="80%w";
    textColor=WidgetColors,
    layout_gravity="center";
  };
  {
    EditText;
    id="linkedit",
    layout_width="80%w";
    layout_gravity="center";   
  };
  {
    TextView;
    id="pathhint",
    text="下载路径",
    layout_width="80%w";
    textColor=WidgetColors,
    layout_marginTop="10dp";
    layout_gravity="center";
  };
  {
    EditText;
    id="pathedit",
    layout_width="80%w";
    layout_gravity="center";
  };
};

AlertDialog.Builder(this)
.setTitle("下载文件")
.setView(loadlayout(Download_layout))
.setPositiveButton("下载",{onClick=function(v)
  end})
.setNegativeButton("取消",nil)
.show()







--列表对话框
items={}
for i=1,5 do
table.insert(items,"项目"..tostring(i))
end
AlertDialog.Builder(this)
.setTitle("列表对话框")
.setItems(items,{onClick=function(l,v) print(items[v+1])end})
.show()


--单选对话框
单选列表={}
for i=1,5 do
table.insert(单选列表,"单选项目"..tostring(i))
end
local 单选对话框=AlertDialog.Builder(this)
.setTitle("列表对话框")
.setSingleChoiceItems(单选列表,-1,{onClick=function(v,p)print(单选列表[p+1])end})
单选对话框.show();



--多选对话框
items={}
for i=1,5 do
table.insert(items,"多选项目"..tostring(i))
end
多选对话框=AlertDialog.Builder(this)
.setTitle("多选框")
.setMultiChoiceItems(items, nil,{ onClick=function(v,p)print(items[p+1])end})
多选对话框.show();

ProgressDialog(进度对话框)

--ProgressDialog__进度条对话框

dialog = ProgressDialog.show(this, "提示", "正在登陆中").hide()
--最简单便捷的方式

dialog2 = ProgressDialog.show(this, "提示", "正在登陆中", false).hide()
--最后一个boolean设置是否是不明确的状态

dialog3 = ProgressDialog.show(this, "提示", "正在登陆中",false, true).hide()
--最后一个boolean设置可以不可以点击取消

dialog4 = ProgressDialog.show(this, "提示", "正在登陆中",false, true, DialogInterface.OnCancelListener{
  onCancel=function()
    print("对话框取消")
  end
}).hide() 

--最后一个参数监听对话框取消,并执行事件





--圆形旋转样式
dialog5= ProgressDialog(this)
dialog5.setProgressStyle(ProgressDialog.STYLE_SPINNER)
dialog5.setTitle("Loading...")
--设置进度条的形式为圆形转动的进度条
dialog5.setMessage("ProgressDialog")
dialog5.setCancelable(true)--设置是否可以通过点击Back键取消
dialog5.setCanceledOnTouchOutside(false)--设置在点击Dialog外是否取消Dialog进度条
dialog5.setOnCancelListener{
  onCancel=function(l)
    print("取消Dialog5")
  end}
--取消对话框监听事件
dialog5.show().hide()





--水平样式
dialog6= ProgressDialog(this)
dialog6.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
--设置进度条的形式为水平进度条
dialog6.setTitle("ProgressDialog_HORIZONTAL")
dialog6.setCancelable(true)--设置是否可以通过点击Back键取消
dialog6.setCanceledOnTouchOutside(false)--设置在点击Dialog外是否取消Dialog进度条
dialog6.setOnCancelListener{
  onCancel=function(l)
    print("取消Dialog6")
  end}
--取消对话框监听事件
dialog6.setMax(100)
--设置最大进度值
dialog6.show().hide()

function 增加(i)
  dialog6.incrementProgressBy(10)
  dialog6.incrementSecondaryProgressBy(10)
  if i=="10" then
    dialog6.dismiss()
    print("加载完成")
  end
  --当进度走完时销毁对话框
end
function 加载()
  require "import"
  for i=1,10 do
    Thread.sleep(300)
    call("增加",tostring(i))
  end
end
--thread(加载)

InputMethodManager(输入法管理器)

在Android的开发中,有时候会遇到软键盘弹出时挡住输入框的情况。
这时候可以设置下软键盘的模式就可以了。
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE|WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
有时候需要软键盘不要把我们的布局整体推上去,这时候可以这样:
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)

模式常量:

软输入区域是否可见。
SOFT_INPUT_MASK_STATE = 0x0f

未指定状态。
SOFT_INPUT_STATE_UNSPECIFIED = 0

不要修改软输入法区域的状态
SOFT_INPUT_STATE_UNCHANGED = 1

隐藏输入法区域(当用户进入窗口时
SOFT_INPUT_STATE_HIDDEN = 2

当窗口获得焦点时,隐藏输入法区域
SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3

显示输入法区域(当用户进入窗口时)
SOFT_INPUT_STATE_VISIBLE = 4

当窗口获得焦点时,显示输入法区域
SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5

窗口应当主动调整,以适应软输入窗口。
SOFT_INPUT_MASK_ADJUST = 0

窗口应当主动调整,以适应软输入窗口。
SOFT_INPUT_MASK_ADJUST = 0xf0

未指定状态,系统将根据窗口内容尝试选择一个输入法样式。
SOFT_INPUT_ADJUST_UNSPECIFIED = 0x00

当输入法显示时,允许窗口重新计算尺寸,使内容不被输入法所覆盖。
不可与SOFT_INPUT_ADJUSP_PAN混合使用;如果两个都没有设置,系统将根据窗口内容自动设置一个选项。
SOFT_INPUT_ADJUST_RESIZE = 0x10

输入法显示时平移窗口。它不需要处理尺寸变化,框架能够移动窗口以确保输入焦点可见。
不可与SOFT_INPUT_ADJUST_RESIZE混合使用;如果两个都没有设置,系统将根据窗口内容自动设置一个选项。
SOFT_INPUT_ADJUST_PAN = 0x20

当用户转至此窗口时,由系统自动设置,所以你不要设置它。
当窗口显示之后该标志自动清除。
SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100


其它Api参考:
import "android.view.inputmethod.InputMethodManager"
 

调用显示系统默认的输入法
imm =  activity.getSystemService(Context.INPUT_METHOD_SERVICE)
imm.showSoftInput(m_receiverView(接受软键盘输入的视图(View)),InputMethodManager.SHOW_FORCED(提供当前操作的标记,SHOW_FORCED表示强制显示))



如果输入法关闭则打开,如果输入法打开则关闭
imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE)
imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS)
  

获取软键盘是否打开
imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE)
isOpen=imm.isActive()
--返回一个布尔值


隐藏软键盘
activity.getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS)

显示软键盘
activity.getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(控件ID, 0)

PopMenu(弹出式菜单)

pop=PopupMenu(activity,view)
menu=pop.Menu
menu.add("项目1").onMenuItemClick=function(a)

end
menu.add("项目2").onMenuItemClick=function(a)

end
pop.show()--显示

PopWindow(弹出式窗口)

pop=PopWindow(activity)--创建PopWindow
pop.setContentView(loadlayout(布局))--设置布局
pop.setWidth(activity.Width*0.3)--设置宽度
pop.setHeight(activity.Width*0.3)--设置高度
pop.setFocusable(true)--设置可获得焦点
window.setTouchable(true)--设置可触摸
--设置点击外部区域是否可以消失
pop.setOutsideTouchable(false)
--显示
pop.showAtLocation(view,0,0,0)

Toast(提示)

--默认Toast
Toast.makeText(activity, "Toast",Toast.LENGTH_SHORT).show()

--自定义位置Toast
Toast.makeText(activity,"自定义位置Toast", Toast.LENGTH_LONG).setGravity(Gravity.CENTER, 0, 0).show()

--带图片Toast
图片=loadbitmap("/sdcard/a.png")
toast = Toast.makeText(activity,"带图片的Toast", Toast.LENGTH_LONG)
toastView = toast.getView()
imageCodeProject = ImageView(activity)
imageCodeProject.setImageBitmap(图片)
toastView.addView(imageCodeProject, 0)
toast.show()

--自定义布局Toast
布局=loadlayout(layout)
local toast=Toast.makeText(activity,"提示",Toast.LENGTH_SHORT).setView(布局).show()

控件常用属性

--EditText(输入框)
singleLine=true--设置单行输入
Error="错误的输入"--设置用户输入了错误的信息时的提醒
MaxLines=5--设置最大输入行数
MaxEms=5--设置每行最大宽度为五个字符的宽度
InputType="number"--设置只可输入数字
Hint="请输入"--设置编辑框为空时的提示文字


--ImageView(图片视图)
src="a.png"--设置控件图片资源
scaleType="fitXY"--设置图片缩放显示
ColorFilter=Color.BLUE--设置图片着色



--ListView(列表视图)
Items={"item1","item2","item3"}--设置列表项目,但只能在布局表设置,动态添加项目请看Adapter View详解。
DividerHeight=0--设置无隔断线
fastScrollEnabled=true--设置是否显示快速滑块



layout_marginBottom--离某元素底边缘的距离
layout_marginLeft--离某元素左边缘的距离
layout_marginRight--离某元素右边缘的距离
layout_marginTop--离某元素上边缘的距离
gravity--属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,gravity="right"则button上面的文字靠右
layout_gravity--是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,layout_gravity="right"则button靠右
scaleType
--[[是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / scaleType值的意义区别:
CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
]]
id--为控件指定相应的ID
text--指定控件当中显示的文字
textSize--指定控件当中字体的大小
background--指定该控件所使用的背景色
width--指定控件的宽度
height--指定控件的高度
layout_width--指定Container组件的宽度
layout_height--指定Container组件的高度
layout_weight--View中很重要的属性,按比例划分空间
padding--指定控件的内边距,也就是说控件当中的内容
sigleLine--如果设置为真的话,则控件的内容在同一行中进行显示

Animation(动画)

--动画主要包括以下几种
Alpha:渐变透明度动画效果
Scale:渐变尺寸伸缩动画效果
Translate:画面转换位置移动动画效果
Rotate:画面转换位置移动动画效果

--共有的属性有
Duration --属性为动画持续时间 时间以毫秒为单位
fillAfter --当设置为true,该动画转化在动画结束后被应用
fillBefore --当设置为true,该动画转化在动画开始前被应用
repeatCount--动画的重复次数 
repeatMode --定义重复的行为 
startOffset --动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
id.startAnimation(Animation)--设置控件开始应用这个动画



--动画状态监听
import "android.view.animation.Animation$AnimationListener"
动画.setAnimationListener(AnimationListener{
  onAnimationStart=function()
    print"动画开始"
  end,
onAnimationEnd=function()
  print"动画结束"
  end,
onAnimationRepeat=function()
  print"动画重复"
  end})


--实例
--控件向右旋转180度
Rotate_right=RotateAnimation(180, 0,
Animation.RELATIVE_TO_SELF, 0.5, 
Animation.RELATIVE_TO_SELF, 0.5)
Rotate_right.setDuration(440)
Rotate_right.setFillAfter(true)

--控件向左旋转180度
Rotate_left=RotateAnimation(0, 180,
Animation.RELATIVE_TO_SELF, 0.5, 
Animation.RELATIVE_TO_SELF, 0.5)
Rotate_left.setDuration(440)
Rotate_left.setFillAfter(true)



--动画设置___从上往下平移动画
Translate_up_down=TranslateAnimation(0, 0, 55, 0)
Translate_up_down.setDuration(800)
Translate_up_down.setFillAfter(true)



--动画设置___透明动画
Alpha=AlphaAnimation(0,1)
Alpha.setDuration(800)


--动画参数值
--AlphaAnimation(透明动画)
AlphaAnimation(float fromStart,float fromEnd)
float fromStart 动画起始透明值
float fromEnd 动画结束透明值

--ScaleAnimation(缩放动画)
ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 
float fromX 动画起始时 X坐标上的伸缩尺寸 
float toX 动画结束时 X坐标上的伸缩尺寸 
float fromY 动画起始时Y坐标上的伸缩尺寸 
float toY 动画结束时Y坐标上的伸缩尺寸 
int pivotXType 动画在X轴相对于物件位置类型 
float pivotXValue 动画相对于物件的X坐标的开始位置 
int pivotYType 动画在Y轴相对于物件位置类型 
float pivotYValue 动画相对于物件的Y坐标的开始位置 


--TranslateAnimation(位移动画)
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
float fromXDelta 动画开始的点离当前View X坐标上的差值 
float toXDelta 动画结束的点离当前View X坐标上的差值 
float fromYDelta 动画开始的点离当前View Y坐标上的差值 
float toYDelta 动画结束的点离当前View Y坐标上的差值 

--RotateAnimation(旋转动画)
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 
float fromDegrees:旋转的开始角度.
float toDegrees:旋转的结束角度.
int pivotXTypeX轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELFRELATIVE_TO_PARENT.
float pivotXValueX坐标的伸缩值
int pivotYTypeY轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELFRELATIVE_TO_PARENT.
float pivotYValueY坐标的伸缩值

LayoutAnimationController(布局动画控制器)

--LayoutAnimationController可以控制一组控件按照规定显示 

--导入类
import "android.view.animation.AnimationUtils"
import "android.view.animation.LayoutAnimationController"


--创建一个Animation对象
animation = AnimationUtils.loadAnimation(activity,android.R.anim.slide_in_left)

--得到对象
lac = LayoutAnimationController(animation)

--设置控件显示的顺序
lac.setOrder(LayoutAnimationController.ORDER_NORMAL)
--LayoutAnimationController.ORDER_NORMAL   顺序显示
--LayoutAnimationController.ORDER_REVERSE 反显示
--LayoutAnimationController.ORDER_RANDOM 随机显示

--设置控件显示间隔时间
lac.setDelay(time)

--设置组件应用
view.setLayoutAnimation(lac)

ObjectAnimator(属性动画)

ObjectAnimator(对象动画)
--属性动画概念:
所谓属性动画:
改变一切能改变的对象的属性值,不同于补间动画
只能改变 alphascalerotatetranslate
听着有点抽象,举例子说明。


补间动画能实现的:
1.alpha(透明)
--第一个参数为 view对象,第二个参数为 动画改变的类型,第三,第四个参数依次是开始透明度和结束透明度。
alpha = ObjectAnimator.ofFloat(text, "alpha", 0, 1)
alpha.setDuration(2000)--设置动画时间
alpha.setInterpolator(DecelerateInterpolator())--设置动画插入器,减速
alpha.setRepeatCount(-1)--设置动画重复次数,这里-1代表无限
alpha.setRepeatMode(Animation.REVERSE)--设置动画循环模式。
alpha.start()--启动动画。

2.scale(缩放)
animatorSet =  AnimatorSet()--组合动画
scaleX = ObjectAnimator.ofFloat(text, "scaleX", 1, 0)
scaleY = ObjectAnimator.ofFloat(text, "scaleY", 1, 0)
animatorSet.setDuration(2000)
animatorSet.setInterpolator(DecelerateInterpolator());
animatorSet.play(scaleX).with(scaleY)--两个动画同时开始
animatorSet.start();

3.translate(平移)
translationUp = ObjectAnimator.ofFloat(button, "Y",button.getY(), 0)
translationUp.setInterpolator(DecelerateInterpolator())
translationUp.setDuration(1500)
translationUp.start()

4. rotate(旋转)
set =  AnimatorSet()
anim = ObjectAnimator .ofFloat(phone, "rotationX", 0, 180)
anim.setDuration(2000)
anim2 = ObjectAnimator .ofFloat(phone, "rotationX", 180, 0)
anim2.setDuration(2000)
anim3 = ObjectAnimator .ofFloat(phone, "rotationY", 0, 180)
anim3.setDuration(2000)
anim4 = ObjectAnimator .ofFloat(phone, "rotationY", 180, 0)
anim4.setDuration(2000)
set.play(anim).before(anim2)--先执行anim动画之后在执行anim2
set.play(anim3).before(anim4)
set.start()


补间动画不能实现的:
5.android 改变背景颜色的动画实现如下
translationUp = ObjectAnimator.ofInt(button,"backgroundColor",{Color.RED, Color.BLUE, Color.GRAY,Color.GREEN})
translationUp.setInterpolator(DecelerateInterpolator())
translationUp.setDuration(1500)
translationUp.setRepeatCount(-1)
translationUp.setRepeatMode(Animation.REVERSE)
translationUp.setEvaluator(ArgbEvaluator())
translationUp.start()
--[[
ArgbEvaluator:这种评估者可以用来执行类型之间的插值整数值代表ARGB颜色。
FloatEvaluator:这种评估者可以用来执行浮点值之间的插值。
IntEvaluator:这种评估者可以用来执行类型int值之间的插值。
RectEvaluator:这种评估者可以用来执行类型之间的插值矩形值。

由于本例是改变View的backgroundColor属性的背景颜色所以此处使用ArgbEvaluator
]]

overridePendingTransition(设置窗口动画)

activity.overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out)

配色参考

--靛蓝配粉色
靛蓝色=0xFF3F51B5
粉色=0xFFE91E63

--蓝色配青绿色
蓝色=0xFF2196F3
青绿色=0xFF009688

--其它:
暗橙色=0xFFFF5722
酸橙色=0xFFCDDC39
深紫色=0xFF673AB7
青色=0xFF0097A7
红色=0xFFF44336
亮蓝=0xFF03A9F4