android_query 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +65 -47
- data/lib/android_query/version.rb +1 -1
- data/lib/android_query/views.rb +212 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fae24679345a4398a3d4c74bfec81e04a949473
|
4
|
+
data.tar.gz: 562ab6af7cd492f6a4ae51bfbe9dff7a06074ea3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02dc384ec6f0cbbd858e04bed96e1baaac1ed05e04f7fffbc50753f18f4a92c364ce707943ae0c133e0ff8919e1f60d2818f20d984b54e064dc9e135f162014c
|
7
|
+
data.tar.gz: 106b1946d4989ff99f1e64f560731e072f00ccbb5a96ccbabb48cfdc963a59593ae96236b18c29c69e5ae6d6424e0da44607d7f49897c6bf72110f035db1070e
|
data/README.md
CHANGED
@@ -15,7 +15,7 @@ It's intended for developers who prefer to code their UIs rather than use a GUI
|
|
15
15
|
Add this line to your application's Gemfile:
|
16
16
|
|
17
17
|
```ruby
|
18
|
-
gem 'android_query', '~> 0.0.
|
18
|
+
gem 'android_query', '~> 0.0.6'
|
19
19
|
```
|
20
20
|
|
21
21
|
And then execute:
|
@@ -33,90 +33,108 @@ Each view should be passed a style method.
|
|
33
33
|
|
34
34
|
```ruby
|
35
35
|
class MainActivity < Android::App::Activity
|
36
|
-
attr_accessor :aq
|
36
|
+
attr_accessor :aq
|
37
37
|
|
38
38
|
def onCreate(savedInstanceState)
|
39
39
|
super
|
40
|
-
self.counter = 0
|
41
40
|
self.aq = AndroidQuery.new(self, HomeStyle)
|
42
|
-
|
43
|
-
top.
|
44
|
-
top.
|
45
|
-
top.
|
46
|
-
|
47
|
-
|
48
|
-
counter_layout.button(:decrement)
|
41
|
+
aq.linear_layout(:top_layout) do |top|
|
42
|
+
top.image_button(:plumbing_button)
|
43
|
+
top.image_button(:electricity_button)
|
44
|
+
top.linear_layout(:directions) do |direction_layout|
|
45
|
+
direction_layout.text_view(:left_text)
|
46
|
+
direction_layout.button(:right_button)
|
49
47
|
end
|
50
48
|
end
|
51
49
|
end
|
52
50
|
|
53
|
-
def
|
54
|
-
|
55
|
-
# for gravity: :bottom, :right, :left, :center, :top, and their combinations
|
56
|
-
# for length: :short, :long
|
57
|
-
self.aq.toast("The counter is set at #{self.counter}", gravity: :bottom_right, length: :short)
|
51
|
+
def coffee_message(view)
|
52
|
+
aq.toast('This is a message for COFFEE LOVERS :)', gravity: :center)
|
58
53
|
end
|
59
54
|
|
60
|
-
def
|
61
|
-
|
55
|
+
def random_thing(view)
|
56
|
+
puts "This should be printed when I click the button"
|
62
57
|
end
|
63
58
|
|
64
|
-
def
|
65
|
-
|
59
|
+
def another_toast(view)
|
60
|
+
aq.toast("This is a purple", gravity: :top_right, length: :long)
|
66
61
|
end
|
67
62
|
end
|
68
63
|
```
|
64
|
+
|
69
65
|
The previous code produces the following app:
|
66
|
+
|
70
67
|
![Sample Screenshot](screenshot.png)
|
71
68
|
|
72
69
|
|
73
70
|
The following is the `HomeStyle` class that styles the screen:
|
74
71
|
```ruby
|
75
72
|
class HomeStyle < AndroidMotionQuery::Stylesheet
|
76
|
-
def top_layout(
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
73
|
+
def top_layout(st)
|
74
|
+
st.width = :mp
|
75
|
+
st.height = 0
|
76
|
+
st.weight_sum = 4
|
77
|
+
st.orientation = :vertical
|
78
|
+
st.background_color = '#A87E54'
|
81
79
|
end
|
82
80
|
|
83
|
-
def
|
84
|
-
|
85
|
-
|
81
|
+
def plumbing_button(st)
|
82
|
+
st.width = :mp
|
83
|
+
st.margin_top = 10
|
84
|
+
st.margin_bottom = 10
|
85
|
+
st.background_image = 'bench'
|
86
|
+
st.click = :coffee_message
|
87
|
+
shared_button_styles(st)
|
86
88
|
end
|
87
89
|
|
88
|
-
def
|
89
|
-
|
90
|
-
|
90
|
+
def electricity_button(st)
|
91
|
+
st.width = :mp
|
92
|
+
st.background_image = 'flower'
|
93
|
+
st.click = :random_thing
|
94
|
+
shared_button_styles(st)
|
91
95
|
end
|
92
96
|
|
93
|
-
def
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
+
def shared_button_styles(st)
|
98
|
+
st.height = 0
|
99
|
+
st.padding = 0
|
100
|
+
st.margin_left = 10
|
101
|
+
st.margin_right = 10
|
102
|
+
st.scale_type = :fit_xy
|
103
|
+
st.weight = 1.5
|
97
104
|
end
|
98
105
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
106
|
+
def directions(st)
|
107
|
+
st.orientation = :horizontal
|
108
|
+
st.weight = 1
|
109
|
+
st.weight_sum = 2
|
110
|
+
st.width = :mp
|
111
|
+
st.height = 0
|
112
|
+
st.margin_top = 10
|
104
113
|
end
|
105
114
|
|
106
|
-
def
|
107
|
-
|
108
|
-
|
109
|
-
|
115
|
+
def left_text(st)
|
116
|
+
st.weight = 1
|
117
|
+
st.text = 'android_query is AWESOME!'
|
118
|
+
st.text_alignment = :center
|
110
119
|
end
|
111
120
|
|
112
|
-
def
|
113
|
-
|
114
|
-
|
115
|
-
|
121
|
+
def right_button(st)
|
122
|
+
st.weight = 1
|
123
|
+
st.text = 'Click Me'
|
124
|
+
st.click = :another_toast
|
125
|
+
st.background_color = '#927FD5'
|
126
|
+
st.text_color = :white
|
116
127
|
end
|
117
128
|
end
|
118
129
|
```
|
119
130
|
|
131
|
+
## Todo List
|
132
|
+
- [ ] Set automatic IDs for views
|
133
|
+
- [ ] Support all built-in android widgets (currently android_query supports 4 widgets)
|
134
|
+
- [ ] Support @string
|
135
|
+
- [x] Support @drawable
|
136
|
+
- [ ] Support easy animations
|
137
|
+
|
120
138
|
## Contributing
|
121
139
|
|
122
140
|
Bug reports and pull requests are welcome on GitHub at https://github.com/aesmail/android_query.
|
data/lib/android_query/views.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module AndroidMotionQuery
|
2
2
|
class View
|
3
|
-
attr_accessor :view, :activity, :stylesheet, :style_name, :layout_params, :options
|
3
|
+
attr_accessor :view, :activity, :stylesheet, :style_name, :layout_params, :options, :extra
|
4
4
|
|
5
5
|
def initialize(view, activity, stylesheet, style_name, layout_params, options = {})
|
6
6
|
self.view = view
|
@@ -12,14 +12,22 @@ module AndroidMotionQuery
|
|
12
12
|
parent: nil,
|
13
13
|
}.merge(options)
|
14
14
|
end
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
15
|
+
|
16
|
+
# convenience methods
|
17
|
+
def get; self.view end
|
18
|
+
def left; get.getLeft end
|
19
|
+
def right; get.getRight end
|
20
|
+
def bottom; get.getBottom end
|
21
|
+
def top; get.getTop end
|
22
|
+
def width; get.getWidth end
|
23
|
+
def height; get.getHeight end
|
24
|
+
def text; get.text end
|
25
|
+
def text=(t); get.text = t end
|
19
26
|
|
20
27
|
def create_android_query_view(view, style_method, layout_params, options = {}, &block)
|
21
28
|
aqv = View.new(view, self.activity, self.stylesheet, style_method, layout_params, options)
|
22
29
|
self.stylesheet.apply_style_for(aqv, style_method, layout_params)
|
30
|
+
puts "Adding #{aqv.get} to #{self.get}"
|
23
31
|
self.get.addView(aqv.get)
|
24
32
|
block.call(aqv) if block_given?
|
25
33
|
aqv
|
@@ -45,6 +53,20 @@ module AndroidMotionQuery
|
|
45
53
|
view = Android::Widget::Button.new(self.activity)
|
46
54
|
create_android_query_view(view, style_method, self.layout_params, {}, &block)
|
47
55
|
end
|
56
|
+
|
57
|
+
def image_view(style_method, &block)
|
58
|
+
view = Android::Widget::ImageView.new(self.activity)
|
59
|
+
create_android_query_view(view, style_method, self.layout_params, {}, &block)
|
60
|
+
end
|
61
|
+
|
62
|
+
def image_button(style_method, &block)
|
63
|
+
view = Android::Widget::ImageButton.new(self.activity)
|
64
|
+
create_android_query_view(view, style_method, self.layout_params, {}, &block)
|
65
|
+
end
|
66
|
+
|
67
|
+
def new_view(view, style_method, &block)
|
68
|
+
create_android_query_view(view, style_method, self.layout_params, {}, &block)
|
69
|
+
end
|
48
70
|
end
|
49
71
|
|
50
72
|
class Stylesheet
|
@@ -52,12 +74,13 @@ module AndroidMotionQuery
|
|
52
74
|
style_view = StylesheetElement.new(view, layout_params)
|
53
75
|
self.send(style_name.to_s, style_view)
|
54
76
|
view.get.setLayoutParams(style_view.params)
|
77
|
+
view.get.tag = view
|
55
78
|
view
|
56
79
|
end
|
57
80
|
end
|
58
81
|
|
59
82
|
class StylesheetElement
|
60
|
-
attr_accessor :view, :params
|
83
|
+
attr_accessor :view, :params, :radius
|
61
84
|
|
62
85
|
LAYOUT_SIZE_OPTIONS = {
|
63
86
|
mp: Android::View::ViewGroup::LayoutParams::MATCH_PARENT,
|
@@ -74,7 +97,12 @@ module AndroidMotionQuery
|
|
74
97
|
self.params = layout_params.new(LAYOUT_SIZE_OPTIONS[:mp], LAYOUT_SIZE_OPTIONS[:wc])
|
75
98
|
self
|
76
99
|
end
|
77
|
-
|
100
|
+
|
101
|
+
def id=(number)
|
102
|
+
|
103
|
+
self.view.get.id = number
|
104
|
+
end
|
105
|
+
|
78
106
|
def text=(t)
|
79
107
|
self.view.get.text = t
|
80
108
|
end
|
@@ -109,9 +137,169 @@ module AndroidMotionQuery
|
|
109
137
|
self.params.weight = number
|
110
138
|
end
|
111
139
|
|
140
|
+
def padding_left=(number)
|
141
|
+
left, top, right, bottom = get_padding
|
142
|
+
self.padding = [number, top, right, bottom]
|
143
|
+
end
|
144
|
+
|
145
|
+
def padding_right=(number)
|
146
|
+
left, top, right, bottom = get_padding
|
147
|
+
self.padding = [left, top, number, bottom]
|
148
|
+
end
|
149
|
+
|
150
|
+
def padding_top=(number)
|
151
|
+
left, top, right, bottom = get_padding
|
152
|
+
self.padding = [left, number, right, bottom]
|
153
|
+
end
|
154
|
+
|
155
|
+
def padding_bottom=(number)
|
156
|
+
left, top, right, bottom = get_padding
|
157
|
+
self.padding = [left, top, right, number]
|
158
|
+
end
|
159
|
+
|
160
|
+
def padding=(number)
|
161
|
+
if number.class == Array && number.count == 4
|
162
|
+
left, top, right, bottom = number
|
163
|
+
self.view.get.setPadding(left, top, right, bottom)
|
164
|
+
elsif number.class == Fixnum
|
165
|
+
self.view.get.setPadding(number, number, number, number)
|
166
|
+
else
|
167
|
+
raise "Invalid value (#{number}) set as padding for #{self.view.get}"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def get_padding
|
172
|
+
v = self.view.get
|
173
|
+
[v.getPaddingLeft, v.getPaddingTop, v.getPaddingRight, v.getPaddingBottom]
|
174
|
+
end
|
175
|
+
|
176
|
+
def margin_left=(number)
|
177
|
+
left, top, right, bottom = get_margins
|
178
|
+
self.margin = [number, top, right, bottom]
|
179
|
+
end
|
180
|
+
|
181
|
+
def margin_right=(number)
|
182
|
+
left, top, right, bottom = get_margins
|
183
|
+
self.margin = [left, top, number, bottom]
|
184
|
+
end
|
185
|
+
|
186
|
+
def margin_top=(number)
|
187
|
+
left, top, right, bottom = get_margins
|
188
|
+
self.margin = [left, number, right, bottom]
|
189
|
+
end
|
190
|
+
|
191
|
+
def margin_bottom=(number)
|
192
|
+
left, top, right, bottom = get_margins
|
193
|
+
self.margin = [left, top, right, number]
|
194
|
+
end
|
195
|
+
|
196
|
+
def get_margins
|
197
|
+
lp = self.params
|
198
|
+
[lp.leftMargin, lp.topMargin, lp.rightMargin, lp.bottomMargin]
|
199
|
+
end
|
200
|
+
|
201
|
+
def margin=(number)
|
202
|
+
if number.class == Array && number.count == 4
|
203
|
+
left, top, right, bottom = number
|
204
|
+
self.params.setMargins(left, top, right, bottom)
|
205
|
+
elsif number.class == Fixnum
|
206
|
+
self.params.setMargins(number, number, number, number)
|
207
|
+
else
|
208
|
+
raise "Invalid value (#{number}) set as margin for #{self.view.get}"
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def extra=(something)
|
213
|
+
self.view.extra = something
|
214
|
+
end
|
215
|
+
|
112
216
|
def click=(method_name)
|
113
217
|
self.view.get.onClickListener = AQClickListener.new(self.view.activity, method_name)
|
114
218
|
end
|
219
|
+
|
220
|
+
# TODO find a solution for rounded corners (with or without images)
|
221
|
+
# def corner_radius=(radius)
|
222
|
+
# self.radius ||= radius
|
223
|
+
# drawable = self.view.get.getDrawable
|
224
|
+
# if drawable
|
225
|
+
# self.draw_image_with_radius(drawable, self.radius)
|
226
|
+
# else
|
227
|
+
# shape = Android::Graphics::GradientDrawable.new
|
228
|
+
# shape.cornerRadius = self.radius
|
229
|
+
# self.view.get.background = shape
|
230
|
+
# end
|
231
|
+
# end
|
232
|
+
# TODO find a solution for rounded corners (with or without images)
|
233
|
+
# def draw_image_with_radius(image, radius)
|
234
|
+
# self.radius ||= radius
|
235
|
+
# width = image.getWidth
|
236
|
+
# height = image.getHeight
|
237
|
+
# result = Android::Graphics::Bitmap.createBitmap(width, height, Android::Graphics::Bitmap::Config::ARGB_8888)
|
238
|
+
# canvas = Android::Graphics::Canvas.new(result)
|
239
|
+
# canvas.drawARGB(0, 0, 0, 0)
|
240
|
+
# paint = Android::Graphics::Paint.new
|
241
|
+
# paint.antiAlias = true
|
242
|
+
# paint.color = AQColor.parse_color('#000000')
|
243
|
+
# rect = Android::Graphics::Rect.new(0, 0, width, height)
|
244
|
+
# rect_f = Android::Graphics::RectF.new(rect)
|
245
|
+
# canvas.drawRoundRect(rect_f, self.radius, self.radius, paint)
|
246
|
+
# paint.xfermode = Android::Graphics::PorterDuffXfermode.new(Android::Graphics::PorterDuff::Mode::SRC_IN)
|
247
|
+
# canvas.drawBitmap(raw, rect, rect, paint)
|
248
|
+
# result
|
249
|
+
# end
|
250
|
+
|
251
|
+
def background_color=(color)
|
252
|
+
self.view.get.backgroundColor = AQColor.parse_color(color.to_s)
|
253
|
+
end
|
254
|
+
|
255
|
+
def background_image=(image_name)
|
256
|
+
context = self.view.get.getContext
|
257
|
+
resource_id = context.getResources.getIdentifier(image_name, "drawable", context.getPackageName)
|
258
|
+
self.view.get.setImageResource(resource_id)
|
259
|
+
end
|
260
|
+
|
261
|
+
def scale_type=(option)
|
262
|
+
scale_types = {
|
263
|
+
center: Android::Widget::ImageView::ScaleType::CENTER,
|
264
|
+
center_crop: Android::Widget::ImageView::ScaleType::CENTER_CROP,
|
265
|
+
center_inside: Android::Widget::ImageView::ScaleType::CENTER_INSIDE,
|
266
|
+
fit_center: Android::Widget::ImageView::ScaleType::FIT_CENTER,
|
267
|
+
fit_end: Android::Widget::ImageView::ScaleType::FIT_END,
|
268
|
+
fit_start: Android::Widget::ImageView::ScaleType::FIT_START,
|
269
|
+
fit_xy: Android::Widget::ImageView::ScaleType::FIT_XY,
|
270
|
+
matrix: Android::Widget::ImageView::ScaleType::MATRIX,
|
271
|
+
}
|
272
|
+
self.view.get.scaleType = scale_types[option]
|
273
|
+
end
|
274
|
+
|
275
|
+
def text_alignment=(alignment)
|
276
|
+
self.gravity = alignment
|
277
|
+
end
|
278
|
+
|
279
|
+
def text_color=(color)
|
280
|
+
self.view.get.textColor = AQColor.parse_color(color.to_s)
|
281
|
+
end
|
282
|
+
|
283
|
+
def gravity=(alignment)
|
284
|
+
gravity_options = {
|
285
|
+
top: Android::View::Gravity::TOP,
|
286
|
+
left: Android::View::Gravity::LEFT,
|
287
|
+
right: Android::View::Gravity::RIGHT,
|
288
|
+
bottom: Android::View::Gravity::BOTTOM,
|
289
|
+
center: Android::View::Gravity::CENTER,
|
290
|
+
bottom_right: Android::View::Gravity::BOTTOM | Android::View::Gravity::RIGHT,
|
291
|
+
bottom_left: Android::View::Gravity::BOTTOM | Android::View::Gravity::LEFT,
|
292
|
+
center_right: Android::View::Gravity::CENTER | Android::View::Gravity::RIGHT,
|
293
|
+
center_left: Android::View::Gravity::CENTER | Android::View::Gravity::LEFT,
|
294
|
+
top_right: Android::View::Gravity::TOP | Android::View::Gravity::RIGHT,
|
295
|
+
top_left: Android::View::Gravity::TOP | Android::View::Gravity::LEFT,
|
296
|
+
}
|
297
|
+
self.view.get.gravity = gravity_options[alignment]
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
class AQColor
|
302
|
+
def self.parse_color(hex); Android::Graphics::Color.parseColor(hex) end
|
115
303
|
end
|
116
304
|
|
117
305
|
class AQClickListener
|
@@ -129,7 +317,7 @@ end
|
|
129
317
|
|
130
318
|
|
131
319
|
class AndroidQuery
|
132
|
-
attr_accessor :activity, :stylesheet
|
320
|
+
attr_accessor :activity, :stylesheet, :root, :view_ids
|
133
321
|
|
134
322
|
def initialize(activity, stylesheet)
|
135
323
|
self.activity = activity
|
@@ -137,17 +325,27 @@ class AndroidQuery
|
|
137
325
|
self
|
138
326
|
end
|
139
327
|
|
140
|
-
def create_android_query_view(view, style_method, layout_params, options = {})
|
141
|
-
AndroidMotionQuery::View.new(view, self.activity, self.stylesheet, style_method, layout_params, options)
|
328
|
+
def create_android_query_view(view, style_method, layout_params, options = {}, &block)
|
329
|
+
self.root = AndroidMotionQuery::View.new(view, self.activity, self.stylesheet, style_method, layout_params, options)
|
330
|
+
self.stylesheet.apply_style_for(self.root, style_method, layout_params)
|
331
|
+
block.call(self.root) if block_given?
|
332
|
+
self.activity.setContentView(self.root.get)
|
333
|
+
end
|
334
|
+
|
335
|
+
def find(id)
|
336
|
+
self.root.get.findViewById(id).tag
|
142
337
|
end
|
143
338
|
|
144
339
|
def linear_layout(style_method, &block)
|
145
340
|
view = Android::Widget::LinearLayout.new(self.activity)
|
146
341
|
layout_params = Android::Widget::LinearLayout::LayoutParams
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
342
|
+
create_android_query_view(view, style_method, layout_params, {}, &block)
|
343
|
+
end
|
344
|
+
|
345
|
+
def relative_layout(style_method, &block)
|
346
|
+
view = Android::Widget::RelativeLayout.new(self.activity)
|
347
|
+
layout_params = Android::Widget::RelativeLayout::Params
|
348
|
+
create_android_query_view(view, style_method, layout_params, {}, &block)
|
151
349
|
end
|
152
350
|
|
153
351
|
def toast(text, options = {})
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: android_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
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-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|