android_motion_query 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +96 -82
- data/lib/android_motion_query/adapters.rb +16 -6
- data/lib/android_motion_query/amq.rb +25 -1
- data/lib/android_motion_query/events.rb +15 -0
- data/lib/android_motion_query/screen.rb +12 -10
- data/lib/android_motion_query/stylesheet.rb +97 -50
- data/lib/android_motion_query/version.rb +1 -1
- data/lib/android_motion_query/views.rb +30 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a229c9f9b35ef709975966d4a4527a28e2179a3f
|
4
|
+
data.tar.gz: 98375db35f31a7a8f65b23580dda5044adcfa3ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 713f5b2fdee999eb6e40eeabed41e3d58b6f221022683b321eabf82d5aed11261cf583bf18de9584e1dcc3bb889526c647af4e1151f740b6d78b6b3630b26d34
|
7
|
+
data.tar.gz: eae6dc3aec88c7bf4992f701f7fbb513b14aed2403ba6ed2188f733f2f305a4bcdd636e84b1ff9370d6520eeb4991960ded54aa4c32a92a2732e54f1adc0f8a3
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@ If you don't like dealing with XML layouts and long method names, `android_motio
|
|
13
13
|
Add this line to your application's Gemfile:
|
14
14
|
|
15
15
|
```ruby
|
16
|
-
gem 'android_motion_query', '~> 0.
|
16
|
+
gem 'android_motion_query', '~> 0.2.0'
|
17
17
|
```
|
18
18
|
|
19
19
|
And then execute:
|
@@ -27,15 +27,15 @@ Or install it yourself as:
|
|
27
27
|
## Usage
|
28
28
|
|
29
29
|
The general rule is to create a top-level layout and add views to it.
|
30
|
-
Each view accepts a style
|
30
|
+
Each view accepts a style name as an argument.
|
31
31
|
|
32
32
|
#### Tiny Example:
|
33
33
|
|
34
34
|
To create a LinearLayout and add a TextView widget to it:
|
35
35
|
|
36
36
|
```ruby
|
37
|
-
amq.
|
38
|
-
my_layout.
|
37
|
+
amq.add(:linear_layout, :layout_style) do |my_layout|
|
38
|
+
my_layout.add(:text_view, :some_information)
|
39
39
|
end
|
40
40
|
```
|
41
41
|
|
@@ -43,7 +43,7 @@ The style for the LinearLayout is `:layout_style` and the TextView has a `:some_
|
|
43
43
|
|
44
44
|
How do you define styles?
|
45
45
|
|
46
|
-
Styles are defined in a separate class that
|
46
|
+
Styles are defined in a separate class that inherits from `AMQStylesheet`.
|
47
47
|
|
48
48
|
Each style is passed a wrapper of the android view:
|
49
49
|
|
@@ -68,110 +68,124 @@ end
|
|
68
68
|
|
69
69
|
#### Complete Example:
|
70
70
|
|
71
|
-
|
72
|
-
class MainActivity < AMQScreen
|
73
|
-
def on_create(saved_state)
|
74
|
-
amq.stylesheet = HomeStyle
|
75
|
-
amq.linear_layout(:top_layout) do |top|
|
76
|
-
top.image_button(:bench_button)
|
77
|
-
top.image_button(:flower_button)
|
78
|
-
top.linear_layout(:directions) do |direction_layout|
|
79
|
-
direction_layout.text_view(:left_text)
|
80
|
-
direction_layout.button(:right_button)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def coffee_message(view)
|
86
|
-
amq.toast('This is a message for COFFEE LOVERS :)', gravity: :center)
|
87
|
-
end
|
88
|
-
|
89
|
-
def random_thing(view)
|
90
|
-
puts "This should be printed when I click the button"
|
91
|
-
end
|
92
|
-
|
93
|
-
def another_toast(view)
|
94
|
-
amq.toast("This is a purple", gravity: :top_right, length: :long)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
```
|
98
|
-
|
99
|
-
The previous code produces the following app:
|
71
|
+
This code creates the following simple calculator app:
|
100
72
|
|
101
73
|

|
102
74
|
|
103
|
-
|
104
|
-
The following is the `HomeStyle` class that styles the screen:
|
105
75
|
```ruby
|
106
|
-
class
|
107
|
-
def
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
76
|
+
class CalculatorScreen < AMQScreen
|
77
|
+
def on_create(state)
|
78
|
+
setup_calculator_variables
|
79
|
+
amq.stylesheet = CalculatorStyle
|
80
|
+
amq.add(:linear_layout, :top_layout) do |top|
|
81
|
+
@result_label = top.add(:text_view, :result_label)
|
82
|
+
top.add(:linear_layout, :buttons_layout) do |bottom|
|
83
|
+
bottom.add(:linear_layout, :row_layout) do |row|
|
84
|
+
row.add(:button, :ac).tap { reset_calculator }
|
85
|
+
row.add(:button, :plus_minus).tap { amq.toast('This is not supported yet') }
|
86
|
+
row.add(:button, :percentage).tap { amq.toast('This is not supported yet') }
|
87
|
+
row.add(:button, :division).tap { save_result_with_operation(:div) }
|
88
|
+
end
|
89
|
+
|
90
|
+
bottom.add(:linear_layout, :row_layout) do |row|
|
91
|
+
row.add(:button, :seven).tap { add_digit('7') }
|
92
|
+
row.add(:button, :eight).tap { add_digit('8') }
|
93
|
+
row.add(:button, :nine).tap { add_digit('9') }
|
94
|
+
row.add(:button, :multiplication).tap { save_result_with_operation(:mul) }
|
95
|
+
end
|
96
|
+
|
97
|
+
bottom.add(:linear_layout, :row_layout) do |row|
|
98
|
+
row.add(:button, :four).tap { add_digit('4') }
|
99
|
+
row.add(:button, :five).tap { add_digit('5') }
|
100
|
+
row.add(:button, :six).tap { add_digit('6') }
|
101
|
+
row.add(:button, :minus).tap { save_result_with_operation(:min) }
|
102
|
+
end
|
103
|
+
|
104
|
+
bottom.add(:linear_layout, :row_layout) do |row|
|
105
|
+
row.add(:button, :one).tap { add_digit('1') }
|
106
|
+
row.add(:button, :two).tap { add_digit('2') }
|
107
|
+
row.add(:button, :three).tap { add_digit('3') }
|
108
|
+
row.add(:button, :plus).tap { save_result_with_operation(:add) }
|
109
|
+
end
|
110
|
+
|
111
|
+
bottom.add(:linear_layout, :row_layout) do |row|
|
112
|
+
row.add(:button, :zero).tap { add_digit('0') }
|
113
|
+
row.add(:button, :decimal_point).tap { add_decimal }
|
114
|
+
row.add(:button, :equals).tap { calculate_result }
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
113
118
|
end
|
114
119
|
|
115
|
-
def
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
st.click = :coffee_message
|
121
|
-
shared_button_styles(st)
|
120
|
+
def setup_calculator_variables
|
121
|
+
@start_new_number = true
|
122
|
+
@first_number = 0
|
123
|
+
@result = 0
|
124
|
+
@operation = nil
|
122
125
|
end
|
123
126
|
|
124
|
-
def
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
127
|
+
def add_digit(digit)
|
128
|
+
@result_label.text = '' if @start_new_number
|
129
|
+
display = @result_label.text + digit
|
130
|
+
if display['.']
|
131
|
+
display = display.to_f unless digit == '0'
|
132
|
+
else
|
133
|
+
display = display.to_i
|
134
|
+
end
|
135
|
+
@result_label.text = display.to_s
|
136
|
+
@start_new_number = false
|
129
137
|
end
|
130
138
|
|
131
|
-
def
|
132
|
-
|
133
|
-
|
134
|
-
st.margin_left = 10
|
135
|
-
st.margin_right = 10
|
136
|
-
st.scale_type = :fit_xy
|
137
|
-
st.weight = 1.5
|
139
|
+
def add_decimal
|
140
|
+
display = @result_label.text
|
141
|
+
@result_label.text = display + '.'
|
138
142
|
end
|
139
143
|
|
140
|
-
def
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
st.margin_top = 10
|
144
|
+
def reset_calculator
|
145
|
+
@result_label.text = '0'
|
146
|
+
@result = 0
|
147
|
+
@first_number = 0
|
148
|
+
@start_new_number = true
|
149
|
+
@operation = nil
|
147
150
|
end
|
148
151
|
|
149
|
-
def
|
150
|
-
|
151
|
-
|
152
|
-
|
152
|
+
def save_result_with_operation(op)
|
153
|
+
display = @result_label.text
|
154
|
+
@first_number = display.to_f
|
155
|
+
@operation = op
|
156
|
+
@start_new_number = true
|
153
157
|
end
|
154
158
|
|
155
|
-
def
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
159
|
+
def calculate_result
|
160
|
+
display = @result_label.text.to_f
|
161
|
+
case @operation
|
162
|
+
when :add
|
163
|
+
@result = @first_number + display
|
164
|
+
when :min
|
165
|
+
@result = @first_number - display
|
166
|
+
when :mul
|
167
|
+
@result = @first_number * display
|
168
|
+
when :div
|
169
|
+
@result = @first_number / display
|
170
|
+
end
|
171
|
+
@result_label.text = @result.to_s
|
161
172
|
end
|
162
173
|
end
|
163
174
|
```
|
164
175
|
|
176
|
+
Please check the `example` folder for the complete calculator app code.
|
177
|
+
|
178
|
+
|
165
179
|
## Todo List
|
166
180
|
- [ ] Refactor - create more "single responsibility" classes and have smaller functions (this will never be "done", it's just here as a constant reminder)
|
167
181
|
- [ ] Set automatic IDs for views
|
168
182
|
- [ ] Add wrappers for all built-in android widgets (currently android_query supports 5 widgets)
|
169
183
|
- [x] Add support for LinearLayouts
|
170
184
|
- [ ] Add support for RelativeLayouts
|
171
|
-
- [
|
185
|
+
- [x] Add support for FrameLayouts
|
172
186
|
- [ ] Add support for AbsoluteLayouts (worth it? AbsoluteLayout is deprecated a long time ago)
|
173
|
-
- [x] Add support for working with custom widgets/views (
|
174
|
-
- [
|
187
|
+
- [x] Add support for working with custom widgets/views (through `amq.new_view()`)
|
188
|
+
- [x] Add support for `amq.tap { block of code }` for `onClickListener` events
|
175
189
|
- [ ] Add support for @string values (strings.xml)
|
176
190
|
- [x] Add support for @drawable values (images in the resources/drawable directory)
|
177
191
|
- [ ] Add support for easy and quick animations
|
@@ -1,9 +1,11 @@
|
|
1
1
|
class AMQAdapter < Android::Widget::BaseAdapter
|
2
|
-
attr_accessor :
|
2
|
+
attr_accessor :context, :items, :view_block
|
3
3
|
|
4
|
-
def initialize(context, list,
|
5
|
-
self.
|
4
|
+
def initialize(context, list, &block)
|
5
|
+
self.context = context
|
6
6
|
self.items = list
|
7
|
+
self.view_block = block if block_given?
|
8
|
+
self
|
7
9
|
end
|
8
10
|
|
9
11
|
def getCount
|
@@ -19,8 +21,16 @@ class AMQAdapter < Android::Widget::BaseAdapter
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def getView(position, convert_view, parent)
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
self.custom_view(position, convert_view, parent, &self.view_block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def custom_view(position, convert_view, parent, &block)
|
28
|
+
if block_given?
|
29
|
+
block.call(self.items[position], position)
|
30
|
+
else
|
31
|
+
text_view = Android::Widget::TextView.new(self.context)
|
32
|
+
text_view.text = self.items[position]
|
33
|
+
text_view
|
34
|
+
end
|
25
35
|
end
|
26
36
|
end
|
@@ -16,12 +16,24 @@ class AndroidMotionQuery
|
|
16
16
|
self.stylesheet.apply_style_for(self.root, style_method, layout_params)
|
17
17
|
block.call(self.root) if block_given?
|
18
18
|
self.activity.setContentView(self.root.get)
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_standalone_amq_view(view, style_method, layout_params, options = {}, &block)
|
23
|
+
amq_view = AMQView.new(view, self.activity, self.stylesheet, style_method, layout_params, options)
|
24
|
+
self.stylesheet.apply_style_for(amq_view, style_method, layout_params)
|
25
|
+
block.call(amq_view) if block_given?
|
26
|
+
amq_view
|
19
27
|
end
|
20
28
|
|
21
29
|
def find(id)
|
22
30
|
self.root.get.findViewById(id).tag
|
23
31
|
end
|
24
32
|
|
33
|
+
def add(view_sym, style, &block)
|
34
|
+
self.send(view_sym, style, &block)
|
35
|
+
end
|
36
|
+
|
25
37
|
def linear_layout(style_method, &block)
|
26
38
|
view = Android::Widget::LinearLayout.new(self.activity)
|
27
39
|
layout_params = Android::Widget::LinearLayout::LayoutParams
|
@@ -30,10 +42,22 @@ class AndroidMotionQuery
|
|
30
42
|
|
31
43
|
def relative_layout(style_method, &block)
|
32
44
|
view = Android::Widget::RelativeLayout.new(self.activity)
|
33
|
-
layout_params = Android::Widget::RelativeLayout::
|
45
|
+
layout_params = Android::Widget::RelativeLayout::LayoutParams
|
34
46
|
create_android_query_view(view, style_method, layout_params, {}, &block)
|
35
47
|
end
|
36
48
|
|
49
|
+
def frame_layout(style_method, &block)
|
50
|
+
view = Android::Widget::FrameLayout.new(self.activity)
|
51
|
+
layout_params = Android::Widget::FrameLayout::LayoutParams
|
52
|
+
create_android_query_view(view, style_method, layout_params, {}, &block)
|
53
|
+
end
|
54
|
+
|
55
|
+
def text_view(style_method, &block)
|
56
|
+
view = Android::Widget::TextView.new(self.activity)
|
57
|
+
layout_params = Android::Widget::LinearLayout::LayoutParams
|
58
|
+
create_standalone_amq_view(view, style_method, layout_params, {}, &block)
|
59
|
+
end
|
60
|
+
|
37
61
|
def toast(text, options = {})
|
38
62
|
options = {
|
39
63
|
gravity: :bottom,
|
@@ -9,3 +9,18 @@ class AMQClickListener
|
|
9
9
|
self.activity.send(self.method_name.to_s, view)
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
|
14
|
+
class AMQTapListener
|
15
|
+
attr_accessor :activity, :amq, :callback
|
16
|
+
def initialize(activity, amq, &block)
|
17
|
+
self.activity = activity
|
18
|
+
self.callback = block
|
19
|
+
self.amq = amq
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def onClick(view)
|
24
|
+
self.callback.call(view)
|
25
|
+
end
|
26
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
class AMQScreen < Android::App::Activity
|
2
|
-
attr_accessor :amq
|
2
|
+
attr_accessor :amq, :extras
|
3
|
+
|
3
4
|
def onCreate(savedInstance)
|
4
5
|
super
|
5
6
|
self.create_amq_object
|
@@ -10,18 +11,19 @@ class AMQScreen < Android::App::Activity
|
|
10
11
|
self.amq = AndroidMotionQuery.new(self)
|
11
12
|
end
|
12
13
|
|
13
|
-
def
|
14
|
+
def open_screen(screen, extra_data={})
|
14
15
|
intent = Android::Content::Intent.new(self, screen)
|
15
|
-
|
16
|
+
extra_data.each do |k, v|
|
17
|
+
intent.putExtra(k.to_s, v)
|
18
|
+
end
|
16
19
|
startActivity(intent)
|
17
20
|
end
|
18
21
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
# self.getExtras
|
22
|
+
def extra(key)
|
23
|
+
data = getIntent.getExtra(key.to_s)
|
24
|
+
if data.nil?
|
25
|
+
puts "WARNING: The extra data (#{key.to_s}) you are trying to get is nil"
|
26
|
+
end
|
27
|
+
data
|
26
28
|
end
|
27
29
|
end
|
@@ -1,4 +1,67 @@
|
|
1
|
+
# TYPE_FACE = Android::Graphics::TypeFace
|
2
|
+
# TYPE_FACE_OPTIONS = {
|
3
|
+
# normal: TYPE_FACE::Create("sans-serif", TYPE_FACE::NORMAL),
|
4
|
+
# normal_bold: TYPE_FACE::Create("sans-serif", TYPE_FACE::BOLD),
|
5
|
+
# light: TYPE_FACE::Create("sans-serif-light", TYPE_FACE::NORMAL),
|
6
|
+
# light_bold: TYPE_FACE::Create("sans-serif-light", TYPE_FACE::BOLD),
|
7
|
+
# condensed: TYPE_FACE::Create("sans-serif-condensed", TYPE_FACE::NORMAL),
|
8
|
+
# condensed_bold: TYPE_FACE::Create("sans-serif-condensed", TYPE_FACE::BOLD),
|
9
|
+
# }
|
10
|
+
|
11
|
+
VIEW_GROUP_PARAMS = Android::View::ViewGroup::LayoutParams
|
12
|
+
LAYOUT_SIZE_OPTIONS = {
|
13
|
+
mp: VIEW_GROUP_PARAMS::MATCH_PARENT,
|
14
|
+
wc: VIEW_GROUP_PARAMS::WRAP_CONTENT,
|
15
|
+
}
|
16
|
+
|
17
|
+
LINEAR_LAYOUT = Android::Widget::LinearLayout
|
18
|
+
ORIENTATION_OPTIONS = {
|
19
|
+
vertical: LINEAR_LAYOUT::VERTICAL,
|
20
|
+
horizontal: LINEAR_LAYOUT::HORIZONTAL,
|
21
|
+
}
|
22
|
+
|
23
|
+
SCALE_TYPE = Android::Widget::ImageView::ScaleType
|
24
|
+
SCALE_TYPES = {
|
25
|
+
center: SCALE_TYPE::CENTER,
|
26
|
+
center_crop: SCALE_TYPE::CENTER_CROP,
|
27
|
+
center_inside: SCALE_TYPE::CENTER_INSIDE,
|
28
|
+
fit_center: SCALE_TYPE::FIT_CENTER,
|
29
|
+
fit_end: SCALE_TYPE::FIT_END,
|
30
|
+
fit_start: SCALE_TYPE::FIT_START,
|
31
|
+
fit_xy: SCALE_TYPE::FIT_XY,
|
32
|
+
matrix: SCALE_TYPE::MATRIX,
|
33
|
+
}
|
34
|
+
|
1
35
|
INPUT_TYPE = Android::Text::InputType
|
36
|
+
INPUT_TYPES = {
|
37
|
+
normal: INPUT_TYPE::TYPE_CLASS_TEXT,
|
38
|
+
password: INPUT_TYPE::TYPE_CLASS_TEXT | INPUT_TYPE::TYPE_TEXT_VARIATION_PASSWORD,
|
39
|
+
visible_password: INPUT_TYPE::TYPE_CLASS_TEXT | INPUT_TYPE::TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
|
40
|
+
number: INPUT_TYPE::TYPE_CLASS_NUMBER,
|
41
|
+
email: INPUT_TYPE::TYPE_CLASS_TEXT | INPUT_TYPE::TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
|
42
|
+
phone: INPUT_TYPE::TYPE_CLASS_PHONE,
|
43
|
+
date: INPUT_TYPE::TYPE_CLASS_DATETIME | INPUT_TYPE::TYPE_DATETIME_VARIATION_DATE,
|
44
|
+
time: INPUT_TYPE::TYPE_CLASS_DATETIME | INPUT_TYPE::TYPE_DATETIME_VARIATION_TIME,
|
45
|
+
datetime: INPUT_TYPE::TYPE_CLASS_DATETIME,
|
46
|
+
}
|
47
|
+
|
48
|
+
GRAVITY = Android::View::Gravity
|
49
|
+
GRAVITY_OPTIONS = {
|
50
|
+
top: GRAVITY::TOP,
|
51
|
+
left: GRAVITY::LEFT,
|
52
|
+
right: GRAVITY::RIGHT,
|
53
|
+
bottom: GRAVITY::BOTTOM,
|
54
|
+
center: GRAVITY::CENTER,
|
55
|
+
center_horizontal: GRAVITY::CENTER_HORIZONTAL,
|
56
|
+
center_vertical: GRAVITY::CENTER_VERTICAL,
|
57
|
+
bottom_right: GRAVITY::BOTTOM | GRAVITY::RIGHT,
|
58
|
+
bottom_left: GRAVITY::BOTTOM | GRAVITY::LEFT,
|
59
|
+
center_right: GRAVITY::CENTER | GRAVITY::RIGHT,
|
60
|
+
center_left: GRAVITY::CENTER | GRAVITY::LEFT,
|
61
|
+
top_right: GRAVITY::TOP | GRAVITY::RIGHT,
|
62
|
+
top_left: GRAVITY::TOP | GRAVITY::LEFT,
|
63
|
+
}
|
64
|
+
|
2
65
|
|
3
66
|
class AMQStylesheet
|
4
67
|
def apply_style_for(view, style_name, layout_params)
|
@@ -15,19 +78,9 @@ end
|
|
15
78
|
class AMQStylesheetElement
|
16
79
|
attr_accessor :view, :params, :radius
|
17
80
|
|
18
|
-
LAYOUT_SIZE_OPTIONS = {
|
19
|
-
mp: Android::View::ViewGroup::LayoutParams::MATCH_PARENT,
|
20
|
-
wc: Android::View::ViewGroup::LayoutParams::WRAP_CONTENT,
|
21
|
-
}
|
22
|
-
|
23
|
-
ORIENTATION_OPTIONS = {
|
24
|
-
vertical: Android::Widget::LinearLayout::VERTICAL,
|
25
|
-
horizontal: Android::Widget::LinearLayout::HORIZONTAL,
|
26
|
-
}
|
27
|
-
|
28
81
|
def initialize(view, layout_params)
|
29
82
|
self.view = view
|
30
|
-
self.params = layout_params.new(LAYOUT_SIZE_OPTIONS[:mp], LAYOUT_SIZE_OPTIONS[:
|
83
|
+
self.params = layout_params.new(LAYOUT_SIZE_OPTIONS[:mp], LAYOUT_SIZE_OPTIONS[:mp])
|
31
84
|
self
|
32
85
|
end
|
33
86
|
|
@@ -38,6 +91,7 @@ class AMQStylesheetElement
|
|
38
91
|
|
39
92
|
def text=(t)
|
40
93
|
self.view.get.text = t
|
94
|
+
self
|
41
95
|
end
|
42
96
|
|
43
97
|
def width=(w)
|
@@ -181,28 +235,27 @@ class AMQStylesheetElement
|
|
181
235
|
# result
|
182
236
|
# end
|
183
237
|
|
238
|
+
def border_color=(color)
|
239
|
+
shape = Android::Graphics::Drawable::ShapeDrawable.new
|
240
|
+
shape.shape = Android::Graphics::Drawable::Shapes::RectShape.new
|
241
|
+
shape.paint.color = AMQColor.parse_color(color.to_s)
|
242
|
+
shape.paint.strokeWidth = 1
|
243
|
+
shape.paint.style = Android::Graphics::Paint::Style::STROKE
|
244
|
+
self.view.get.background = shape
|
245
|
+
end
|
246
|
+
|
184
247
|
def background_color=(color)
|
185
248
|
self.view.get.backgroundColor = AMQColor.parse_color(color.to_s)
|
186
249
|
end
|
187
250
|
|
188
|
-
def
|
251
|
+
def image=(image_name)
|
189
252
|
context = self.view.get.getContext
|
190
253
|
resource_id = context.getResources.getIdentifier(image_name, "drawable", context.getPackageName)
|
191
254
|
self.view.get.setImageResource(resource_id)
|
192
255
|
end
|
193
256
|
|
194
257
|
def scale_type=(option)
|
195
|
-
|
196
|
-
center: Android::Widget::ImageView::ScaleType::CENTER,
|
197
|
-
center_crop: Android::Widget::ImageView::ScaleType::CENTER_CROP,
|
198
|
-
center_inside: Android::Widget::ImageView::ScaleType::CENTER_INSIDE,
|
199
|
-
fit_center: Android::Widget::ImageView::ScaleType::FIT_CENTER,
|
200
|
-
fit_end: Android::Widget::ImageView::ScaleType::FIT_END,
|
201
|
-
fit_start: Android::Widget::ImageView::ScaleType::FIT_START,
|
202
|
-
fit_xy: Android::Widget::ImageView::ScaleType::FIT_XY,
|
203
|
-
matrix: Android::Widget::ImageView::ScaleType::MATRIX,
|
204
|
-
}
|
205
|
-
self.view.get.scaleType = scale_types[option]
|
258
|
+
self.view.get.scaleType = SCALE_TYPES[option]
|
206
259
|
end
|
207
260
|
|
208
261
|
def text_alignment=(alignment)
|
@@ -213,22 +266,22 @@ class AMQStylesheetElement
|
|
213
266
|
self.view.get.textColor = AMQColor.parse_color(color.to_s)
|
214
267
|
end
|
215
268
|
|
269
|
+
def text_size=(size)
|
270
|
+
self.view.get.textSize = size
|
271
|
+
end
|
272
|
+
|
273
|
+
# def font=(font)
|
274
|
+
# if TYPE_FACE_OPTIONS.keys.include? font
|
275
|
+
# self.view.get.typeFace = TYPE_FACE_OPTIONS[font]
|
276
|
+
# else
|
277
|
+
# raise "The value #{font} is not a supported font value. Use one of #{TYPE_FACE_OPTIONS.keys}"
|
278
|
+
# end
|
279
|
+
# end
|
280
|
+
|
216
281
|
def hint=(t)
|
217
282
|
self.view.get.hint = t
|
218
283
|
end
|
219
284
|
|
220
|
-
INPUT_TYPES = {
|
221
|
-
normal: INPUT_TYPE::TYPE_CLASS_TEXT,
|
222
|
-
password: INPUT_TYPE::TYPE_CLASS_TEXT | INPUT_TYPE::TYPE_TEXT_VARIATION_PASSWORD,
|
223
|
-
visible_password: INPUT_TYPE::TYPE_CLASS_TEXT | INPUT_TYPE::TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
|
224
|
-
number: INPUT_TYPE::TYPE_CLASS_NUMBER,
|
225
|
-
email: INPUT_TYPE::TYPE_CLASS_TEXT | INPUT_TYPE::TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
|
226
|
-
phone: INPUT_TYPE::TYPE_CLASS_PHONE,
|
227
|
-
date: INPUT_TYPE::TYPE_CLASS_DATETIME | INPUT_TYPE::TYPE_DATETIME_VARIATION_DATE,
|
228
|
-
time: INPUT_TYPE::TYPE_CLASS_DATETIME | INPUT_TYPE::TYPE_DATETIME_VARIATION_TIME,
|
229
|
-
datetime: INPUT_TYPE::TYPE_CLASS_DATETIME,
|
230
|
-
}
|
231
|
-
|
232
285
|
def input_type=(text_type)
|
233
286
|
if INPUT_TYPES.keys.include? text_type
|
234
287
|
self.view.get.inputType = INPUT_TYPES[text_type]
|
@@ -238,21 +291,6 @@ class AMQStylesheetElement
|
|
238
291
|
end
|
239
292
|
end
|
240
293
|
|
241
|
-
GRAVITY = Android::View::Gravity
|
242
|
-
GRAVITY_OPTIONS = {
|
243
|
-
top: GRAVITY::TOP,
|
244
|
-
left: GRAVITY::LEFT,
|
245
|
-
right: GRAVITY::RIGHT,
|
246
|
-
bottom: GRAVITY::BOTTOM,
|
247
|
-
center: GRAVITY::CENTER,
|
248
|
-
bottom_right: GRAVITY::BOTTOM | GRAVITY::RIGHT,
|
249
|
-
bottom_left: GRAVITY::BOTTOM | GRAVITY::LEFT,
|
250
|
-
center_right: GRAVITY::CENTER | GRAVITY::RIGHT,
|
251
|
-
center_left: GRAVITY::CENTER | GRAVITY::LEFT,
|
252
|
-
top_right: GRAVITY::TOP | GRAVITY::RIGHT,
|
253
|
-
top_left: GRAVITY::TOP | GRAVITY::LEFT,
|
254
|
-
}
|
255
|
-
|
256
294
|
def gravity=(alignment)
|
257
295
|
if GRAVITY_OPTIONS.keys.include? alignment
|
258
296
|
self.view.get.gravity = GRAVITY_OPTIONS[alignment]
|
@@ -261,4 +299,13 @@ class AMQStylesheetElement
|
|
261
299
|
self.gravity = :center
|
262
300
|
end
|
263
301
|
end
|
302
|
+
|
303
|
+
def layout_gravity=(alignment)
|
304
|
+
if GRAVITY_OPTIONS.keys.include? alignment
|
305
|
+
self.params.gravity = GRAVITY_OPTIONS[alignment]
|
306
|
+
else
|
307
|
+
puts "The value #{alignment} is not a supported gravity value. Defaulting to center."
|
308
|
+
self.params.gravity = :center
|
309
|
+
end
|
310
|
+
end
|
264
311
|
end
|
@@ -14,7 +14,7 @@ class AMQView
|
|
14
14
|
|
15
15
|
# convenience methods
|
16
16
|
def id; get.id end
|
17
|
-
def id=(vid); get.id = vid end
|
17
|
+
def id=(vid); get.id = vid; self end
|
18
18
|
def get; self.view end
|
19
19
|
def left; get.getLeft end
|
20
20
|
def right; get.getRight end
|
@@ -24,7 +24,12 @@ class AMQView
|
|
24
24
|
def height; get.getHeight end
|
25
25
|
def text; get.text end
|
26
26
|
def text=(t); get.text = t end
|
27
|
-
|
27
|
+
def data(t); get.text = t; self end
|
28
|
+
def tap(&block)
|
29
|
+
self.get.onClickListener = AMQTapListener.new(self.activity, self, &block)
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
28
33
|
def create_android_query_view(view, style_method, layout_params, options = {}, &block)
|
29
34
|
aqv = AMQView.new(view, self.activity, self.stylesheet, style_method, layout_params, options)
|
30
35
|
self.stylesheet.apply_style_for(aqv, style_method, layout_params)
|
@@ -33,11 +38,27 @@ class AMQView
|
|
33
38
|
aqv
|
34
39
|
end
|
35
40
|
|
41
|
+
def add(view_sym, style, &block)
|
42
|
+
self.send(view_sym, style, &block)
|
43
|
+
end
|
44
|
+
|
36
45
|
def linear_layout(style_method, &block)
|
37
46
|
view = Android::Widget::LinearLayout.new(self.activity)
|
38
47
|
lp = Android::Widget::LinearLayout::LayoutParams
|
39
48
|
create_android_query_view(view, style_method, lp, {}, &block)
|
40
49
|
end
|
50
|
+
|
51
|
+
def relative_layout(style_method, &block)
|
52
|
+
view = Android::Widget::RelativeLayout.new(self.activity)
|
53
|
+
lp = Android::Widget::RelativeLayout::LayoutParams
|
54
|
+
create_android_query_view(view, style_method, lp, {}, &block)
|
55
|
+
end
|
56
|
+
|
57
|
+
def frame_layout(style_method, &block)
|
58
|
+
view = Android::Widget::FrameLayout.new(self.activity)
|
59
|
+
lp = Android::Widget::FrameLayout::LayoutParams
|
60
|
+
create_android_query_view(view, style_method, lp, {}, &block)
|
61
|
+
end
|
41
62
|
|
42
63
|
def text_view(style_method, &block)
|
43
64
|
view = Android::Widget::TextView.new(self.activity)
|
@@ -65,10 +86,16 @@ class AMQView
|
|
65
86
|
end
|
66
87
|
|
67
88
|
def grid_view(style_method, &block)
|
68
|
-
view = Android::Widget::GridView.new(self)
|
89
|
+
view = Android::Widget::GridView.new(self.activity)
|
69
90
|
new_view(view, style_method, &block)
|
70
91
|
end
|
71
92
|
|
93
|
+
def adapter(list, &block)
|
94
|
+
# this method has to be called from a grid_view or similar views (which accept adapters)
|
95
|
+
self.get.adapter = AMQAdapter.new(self.activity, list, &block)
|
96
|
+
self
|
97
|
+
end
|
98
|
+
|
72
99
|
def new_view(view, style_method, &block)
|
73
100
|
create_android_query_view(view, style_method, self.layout_params, {}, &block)
|
74
101
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: android_motion_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abdullah Esmail
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -42,7 +42,7 @@ files:
|
|
42
42
|
- lib/android_motion_query/stylesheet.rb
|
43
43
|
- lib/android_motion_query/version.rb
|
44
44
|
- lib/android_motion_query/views.rb
|
45
|
-
homepage: https://github.com/aesmail/android-query
|
45
|
+
homepage: https://github.com/aesmail/android-motion-query
|
46
46
|
licenses:
|
47
47
|
- MIT
|
48
48
|
metadata: {}
|