Skip to content

Instantly share code, notes, and snippets.

@amirrajan
Last active March 24, 2016 11:38
Show Gist options
  • Select an option

  • Save amirrajan/c36c6c1c8c7c7d63c261 to your computer and use it in GitHub Desktop.

Select an option

Save amirrajan/c36c6c1c8c7c7d63c261 to your computer and use it in GitHub Desktop.

Revisions

  1. amirrajan revised this gist Mar 21, 2016. 1 changed file with 7 additions and 0 deletions.
    7 changes: 7 additions & 0 deletions usage.rb
    Original file line number Diff line number Diff line change
    @@ -38,6 +38,13 @@ def history_view
    def onCreate()
    setContentView(generate_screen)
    end

    def root_view *views
    r = vertical_layout(:root, *views)
    r.setBackgroundColor(ViewState.black)
    r.setDrawingCacheQuality(1)
    r
    end

    def onClick view
    @views.keys.each do |k|
  2. amirrajan revised this gist Mar 21, 2016. 1 changed file with 14 additions and 4 deletions.
    18 changes: 14 additions & 4 deletions usage.rb
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    class MainActivity < < Android::App::Activity
    class MainActivity < Android::App::Activity
    include ViewGeneration

    def generate_screen
    @@ -34,8 +34,18 @@ def history_view
    horizontal_layout.setMargins(10, 10, 10, 10)
    end
    end
    end

    def onCreate()
    setContentView(generate_screen)
    def onCreate()
    setContentView(generate_screen)
    end

    def onClick view
    @views.keys.each do |k|
    if(@views[k].is_a? Array and @views[k].include? view)
    self.send(k.to_s + "_clicked")
    elsif(@views[k] == view)
    self.send(k.to_s + "_clicked")
    end
    end
    end
    end
  3. amirrajan revised this gist Mar 21, 2016. 1 changed file with 11 additions and 0 deletions.
    11 changes: 11 additions & 0 deletions usage.rb
    Original file line number Diff line number Diff line change
    @@ -23,6 +23,17 @@ def generate_screen
    history_view
    )
    end

    def history_view
    horizontal_layout(:history_view,
    scroll_view(:scroll_view_history,
    text_view(:text_view_history, "")
    )
    ) do |horizontal_layout|
    horizontal_layout.weight = 1
    horizontal_layout.setMargins(10, 10, 10, 10)
    end
    end
    end

    def onCreate()
  4. amirrajan revised this gist Mar 21, 2016. 1 changed file with 30 additions and 0 deletions.
    30 changes: 30 additions & 0 deletions usage.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,30 @@
    class MainActivity < < Android::App::Activity
    include ViewGeneration

    def generate_screen
    root_view(
    horizontal_layout(:row0, text_view(:title, "a dark room")),
    horizontal_layout(:row1,
    hidden_button(:outside_button, "a silent forest"),
    hidden_button(:embark_button, "a dusty path")
    ),
    progress_bar(:light_fire_pb, "light_fire"),
    horizontal_layout(:row3,
    hidden_button(:supplies_button, "supplies"),
    hidden_button(:builder_button, "builder")
    ),
    horizontal_layout(:row4,
    hidden_button(:merchant_button, "merchant"),
    hidden_button(:workshop_button, "workshop")
    ),
    spacer() do |spacer_layout|
    spacer_layout.height = device_height * 0.35
    end,
    history_view
    )
    end
    end

    def onCreate()
    setContentView(generate_screen)
    end
  5. amirrajan created this gist Mar 21, 2016.
    253 changes: 253 additions & 0 deletions view_generation.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,253 @@
    module ViewGeneration
    def button id, text
    b = Android::Widget::Button.new self
    b.setText text
    b.setOnClickListener(self)
    b.setBackground(button_background)

    ld = layout_definition(
    width: :fill,
    height: :auto,
    margin_top: 10,
    weight: 0.3,
    margin_bottom: 10,
    margin_right: 10,
    margin_left: 10)

    yield ld, b if block_given?

    b.setLayoutParams(ld)

    add_to_control_set(id, b)

    b
    end

    def hidden_button id, text
    raise "hidden_button cannot take in an implicit block" if block_given?

    button(id, text) { |_, b| hide b }
    end

    def text_view id, text
    tv = Android::Widget::TextView.new(self)
    tv.setText(text)
    tv.setGravity(gravity_center)
    tv.setTextSize(14)
    ld = layout_definition(width: :fill)
    yield ld, tv if block_given?
    tv.setLayoutParams(ld)
    add_to_control_set(id, tv)
    tv
    end

    def spacer()
    fl = Android::Widget::FrameLayout.new(self)
    ld = layout_definition(width: :fill, height: :fill)
    yield ld if block_given?
    fl.setLayoutParams(ld)
    fl
    end

    def progress_bar id, text
    pg = Android::Widget::ProgressBar.new(
    self,
    nil, Android::R::Attr::ProgressBarStyleHorizontal)
    pg.setOnClickListener(self)
    pg.setClickable(true)
    pg.setIndeterminate(false)
    pg.setLayoutParams(layout_definition(width: :fill, margin_left: 5, margin_right: 5, margin_bottom: 5))
    tv = text_view(id, text) do |layout|
    layout.setMargins(0, 5, 0, 0)
    end
    tv.setTextSize(18)
    tv.setOnClickListener(self)
    add_to_control_set(id, tv)
    add_to_control_set(id, pg)
    vl = vertical_layout(id, tv, pg)
    vl
    end

    def vertical_layout id, *views
    vl = Android::Widget::LinearLayout.new(self)
    vl.setOrientation(Android::Widget::LinearLayout::VERTICAL)
    vl.setBaselineAligned(false)
    vl.setDrawingCacheQuality(1)
    ld = layout_definition(width: :fill)
    yield ld, vl if block_given?
    vl.setLayoutParams(ld)
    views.each { |v| vl.addView(v) }
    add_to_control_set(id, vl)
    vl
    end

    def horizontal_layout id, *views
    hl = Android::Widget::LinearLayout.new(self)
    hl.setOrientation(Android::Widget::LinearLayout::HORIZONTAL)
    hl.setBaselineAligned(false)
    hl.setDrawingCacheQuality(1)
    ld = layout_definition(width: :fill)
    yield ld, hl if block_given?
    hl.setLayoutParams(ld)
    views.each { |v| hl.addView(v) }
    add_to_control_set(id, hl)
    hl
    end

    def relative_layout id, *views
    rl = Android::Widget::RelativeLayout.new(self)
    # rl.setOrientation(Android::Widget::LinearLayout::HORIZONTAL)
    # rl.setBaselineAligned(false)
    rl.setDrawingCacheQuality(1)
    ld = layout_definition(width: :fill, height: :fill)
    yield ld, rl if block_given?
    rl.setLayoutParams(ld)
    views.each { |v| rl.addView(v) }
    add_to_control_set(id, rl)
    rl
    end

    def scroll_view id, *views
    sv = Android::Widget::ScrollView.new(self)
    sv.setLayoutParams(layout_definition(width: :fill))
    sv.setSmoothScrollingEnabled(true)
    sv.setFillViewport(true)
    ld = layout_definition(width: :fill)
    yield ld if block_given?
    sv.setLayoutParams(ld)
    views.each { |v| sv.addView(v) }
    add_to_control_set id, sv
    sv
    end

    def layout_definition opts
    attrs = {
    fill: fill,
    auto: auto
    }

    width = attrs[opts[:width] || :auto]
    height = attrs[opts[:height] || :auto] || opts[:height]
    left = opts[:margin_left] || 0
    top = opts[:margin_top] || 0
    right = opts[:margin_right] || 0
    bottom = opts[:margin_bottom] || 0

    layout = Android::Widget::LinearLayout::LayoutParams.new(width, height, opts[:weight] || 0)
    layout.setMargins(left, top, right, bottom)
    layout
    end

    def resolve_type type
    @lookup ||= {
    button: Android::Widget::Button,
    progress_bar: Android::Widget::ProgressBar,
    text_view: Android::Widget::TextView,
    scroll_view: Android::Widget::ScrollView,
    linear_layout: Android::Widget::LinearLayout
    }

    @lookup[type] || type
    end

    def find_view id, type = Android::View::View
    @find_view_cache ||= { }

    type = resolve_type(type)

    return @find_view_cache[[type, id]] if @find_view_cache[[type, id]]

    if(@views[id].is_a? Array)
    @find_view_cache[[type, id]] = @views[id].find { |c| c.is_a? type }
    else
    @find_view_cache[[type, id]] = @views[id]
    end

    @find_view_cache[[type, id]]
    end

    def find_views_of_type type
    @find_views_cache ||= { }

    type = resolve_type(type)

    return @find_views_cache[type] if @find_views_cache[type]

    results = []

    @views.keys.each do |k|
    if @views[k].is_a? Array
    @views[k].each do |v|
    results << v if v.is_a? type
    end
    elsif @views[k].is_a? type
    results << @views[k]
    end
    end

    @find_views_cache[type] = results

    @find_views_cache[type]
    end

    def add_to_control_set id, control
    if(@views[id] and @views[id].is_a? Array)
    @views[id] << control
    elsif(@views[id])
    all = Array.new
    all = [@views[id], control]
    @views[id] = all
    else
    @views[id] = control
    end
    end

    def pb_disabled_color
    @pb_disabled_color ||= Android::Graphics::LightingColorFilter.new("FF000000".hex, "FF666666".hex)
    @pb_disabled_color
    end

    def fill
    Android::Widget::LinearLayout::LayoutParams::MATCH_PARENT
    end

    def auto
    Android::Widget::LinearLayout::LayoutParams::WRAP_CONTENT
    end

    def gravity_left
    Android::View::Gravity::LEFT
    end

    def gravity_center
    Android::View::Gravity::CENTER
    end

    def hide view
    view.setVisibility(0x0000000004)
    end

    def gone view
    view.setVisibility(0x0000000008)
    end

    def fade_in view, animate
    return if view.getVisibility() == 0x0000000000

    if animate
    view.setAlpha(0)
    view.setVisibility(0x0000000000)

    a = Android::Animation::ObjectAnimator.new
    a.target = view
    a.propertyName = "alpha"
    a.setObjectValues([0, 1])
    a.setEvaluator(Android::Animation::FloatEvaluator.new)
    a.setDuration(1000)
    a.start
    else
    view.setAlpha(100)
    view.setVisibility(0x0000000000)
    end
    end
    end