7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

kivy FloatLayout でのImageの配置(Responsive)

Last updated at Posted at 2018-07-10

FloatLayout内にてImage widgetを以下の要求に答える表示をしたい
ほとんどの資料は、使用する画像が決まっているためか、size、size_hintが固定で以下の要求の設定パターンが見つからなかったため記録に残します。

要求

  • 任意の場所に表示
  • 使用する画像はサイズ・アスクペクト比を指定しない
  • アスペクト比を維持して表示

要はWEBでよくいうレスポンシブ

設定例:左上、横サイズ25%

失敗例

設定内容

#:kivy 1.10
#-*- coding: utf-8 -*-

<Logo@Image>:
    size_hint:0.25,None
    source:'./logo.jpg'
    allow_stretch:True
    keep_ratio: True
    canvas.before:
        Color:
            rgba: 1, 0, 0, 0.5
        Rectangle:
            size: self.size
            pos: self.pos
            
FloatLayout:
    Logo:
        pos_hint:{'x':0,'top':1}
  • pos_hint:{'x':0,'top':1}  左上指定
  • size_hint:0.25,None  Width指定、Heightは未指定
  • allow_stretch:True  サイズいっぱいに表示
  • keep_ratio: True アスペクト比を維持

結果
左上にくっつかずに表示されている(赤枠はImage Widgetの範囲)
原因はデフォルト設定の size:100,100 のheight部分が反映されているため
floatlayout は size_hint > size で反映される
今回、height部分はNoneのため、sizeのheightが反映されているために画像を超えてImage Widgetが設定された。

スクリーンショット 2018-07-10 12.39.32.png


成功例1(height指定)

設定内容
失敗例に追加でheightを指定
指定方法は画像の比率(image_ratio)とImage WidgetのWidthから高さを算出して設定

追記 2018/7/10
Windowサイズからはみ出す場合がある(色々試してたら発生した・・・)
特に気にしなくてもいいかもしれないけど対策した成功例2を掲載

  • height: self.width/self.image_ratio
#:kivy 1.10
#-*- coding: utf-8 -*-

<Logo@Image>:
    size_hint:0.25,None
    source:'./logo.jpg'
    allow_stretch:True
    keep_ratio: True
    canvas.before:
        Color:
            rgba: 1, 0, 0, 0.5
        Rectangle:
            size: self.size
            pos: self.pos
            
FloatLayout:
    Logo:
        pos_hint:{'x':0,'top':1}
        height: self.width/self.image_ratio

スクリーンショット 2018-07-10 12.56.38.png


成功例2(size_hint_max指定)

設定内容
成功例1の際、アスペクト比・Windowサイズによってはみ出てしまう
その対策バージョン(画面内に収まる+適切なWidget範囲) 

2018/7/11
縦横両方の可変に対応した方法はうまくいかない時があったので修正
大きくずらさない限りは大丈夫なはずです

#:kivy 1.10
#-*- coding: utf-8 -*-

<Logo@Image>:
    size_hint:0.25,1
    size_hint_max:self.parent.height*self.image_ratio,self.width/self.image_ratio
    source:'./img/logo.jpg'
    allow_stretch:True
    keep_ratio: True
    canvas.before:
        Color:
            rgba: 1, 0, 0, 0.5
        Rectangle:
            size: self.size
            pos: self.pos
            
FloatLayout:
    Logo:
        pos_hint:{'x':0,'top':1}
                

size_hintにてNoneから1に変更
size_hint_max_yにて高さを調整する。

Widthを可変に調整したい場合(例 高さ25%)

size_hint:1,0.25
size_hint_max:self.height*self.image_ratio,self.parent.width/self.image_ratio

あとがき

height:auto とかそうゆうのがほしかった。
他に方法あるかもしれないけど満足
よほどじゃない限り大丈夫かも・・・

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?