Stopping for tonight. First day of high school tomorrow, that means summer's over and I have a lot less time. Here's what I have now. Fixed most bugs. I still want to tweak the animation, but here it is.
# coding: utf-8
import ui
from PIL import Image
from io import BytesIO
def pil_to_ui(img):
b = BytesIO()
img.save(b, "PNG")
data = b.getvalue()
b.close()
return ui.Image.from_data(data)
class CoverFlow(ui.View):
def __init__(self, images):
self.images = [pil_to_ui(image) for image in images]
self.frame = (0, 0, 1024, 384)
self.background_color='#0F0F0F'
#Create subviews
iv0 = ui.ImageView(frame=(-100, 142, 100, 100), name='iv0')
iv0.image = self.images[0]
iv0.prev_frame = iv0.frame
self.add_subview(iv0)
iv1 = ui.ImageView(frame=(-10, 122, 140, 140), name='iv1')
iv1.image = self.images[1]
iv1.prev_frame = iv1.frame
self.add_subview(iv1)
iv2 = ui.ImageView(frame=(90, 102, 180, 180), name='iv2')
iv2.image = self.images[2]
iv2.prev_frame = iv2.frame
self.add_subview(iv2)
iv3 = ui.ImageView(frame=(180, 72, 240, 240), name='iv3')
iv3.image = self.images[3]
iv3.prev_frame = iv3.frame
self.add_subview(iv3)
iv4 = ui.ImageView(frame=(327, 7, 370, 370), name='iv4')
iv4.image = self.images[4]
iv4.prev_frame = iv4.frame
self.add_subview(iv4)
iv5 = ui.ImageView(frame=(604, 72, 240, 240), name='iv5')
iv5.image = self.images[5]
self.add_subview(iv5)
iv5.prev_frame = iv5.frame
iv5.send_to_back()
iv6 = ui.ImageView(frame=(754, 102, 180, 180), name='iv6')
iv6.image = self.images[6]
self.add_subview(iv6)
iv6.prev_frame = iv6.frame
iv6.send_to_back()
iv7 = ui.ImageView(frame=(894, 122, 140, 140), name='iv7')
iv7.image = self.images[7]
self.add_subview(iv7)
iv7.prev_frame = iv7.frame
iv7.send_to_back()
iv8 = ui.ImageView(frame=(1024, 142, 100, 100), name='iv8')
iv8.image = self.images[8]
self.add_subview(iv8)
iv8.prev_frame = iv8.frame
iv8.send_to_back()
def right_anim(self):
for sub in self.subviews:
index = self.subviews.index(sub)
next = self.subviews[index+1] if index<8 else self.subviews[0]
sub.frame = next.prev_frame
for sub in self.subviews:
sub.prev_frame = sub.frame
#Reorder layers based on the fact that biggest images are in front
#Bring smallest images to front first
for s in sorted(self.subviews, key=lambda x: x.frame[3]): s.bring_to_front()
def left_anim(self):
for sub in self.subviews:
index = self.subviews.index(sub)
next = self.subviews[index-1] if index>0 else self.subviews[8]
sub.frame = next.prev_frame
for sub in self.subviews:
sub.prev_frame = sub.frame
#Reorder layers based on the fact that biggest images are in front
#Bring smallest images to front first
for s in sorted(self.subviews, key=lambda x: x.frame[3]): s.bring_to_front()
def touch_began(self, touch):
pass
def touch_moved(self, touch):
if touch.location[0]<touch.prev_location[0]:
self.touch_direction = 0
elif touch.location[0]>touch.prev_location[0]:
self.touch_direction = 1
def touch_ended(self, touch):
if self.touch_direction:
ui.animate(self.right_anim, duration=1.0)
else:
ui.animate(self.left_anim, duration=1.0)
if __name__ == '__main__':
names = ['test:Boat', 'test:Lenna', 'test:Pythonista', 'test:Peppers', 'test:Sailboat', 'test:Bridge', 'test:Mandrill', 'emj:Baby_Chick_3', 'emj:Tulip']
images = [Image.open(n) for n in names]
view = ui.View(background_color='#0f0f0f')
view.add_subview(CoverFlow(images))
view.present(hide_title_bar=True)