Saturday, April 20, 2013

Làm UI cho android: màn hình login, từ PSD->XML

Nói về chuyện phát triển phần mềm cho android khá là váng đầu cho người mới chuyển từ làm chương trình cho Windows với .NET như mình, làm giao diện cho chương trình bằng XML đúng là quá khó (với ai đã làm với website có lẽ sẽ dễ hơn chăng?)

Mình dò dẫm trên mạng, tìm được những giao diện cực đẹp, nhưng ở định dạng PSD (của photoshop). Người ta gọi là UI Kit. PSD dành cho dân thiết kế làm mockup nhưng với mình làm coding không biết phải "hiện thực hóa" cái giao diện đẹp đẽ trên PSD đấy trên android thì làm thế nào, mà cụ thể là bằng xml? Câu hỏi này có lẽ nhiều người mới làm (như mình) sẽ phải hỏi, không biết làm thế nào và bắt đầu từ đâu.

Dưới đây là vài ghi chép lại mình đã làm 1 file PSD layout cho phần mềm thế nào. Và chuyển nó sang XML layout android ra sao. Nó không hẳn là hướng dẫn mà chỉ là ghi chép vắn tắt.

Giao diện làm là activity Login/Connect của phần mềm đang viết.

Đầu tiên: PSD (giả sử là nhặt được ở đâu về hoặc tự làm)
 

Bên trái là giao diện làm ở PSD với các edittext, nút bấm. Bên phải là các layer được sử dụng.
PSD này mình tự làm bằng cách lấy các phần tử cơ bản của 1 cái UI Kit free ở http://designmodo.com/flat-free/, rồi lắp ghép nó lại thành như trên.

Tiếp theo làm thế nào để bê cái này vào XML layout của android.
Có lẽ có nhiều cách để làm: dùng XML Shape vẽ lại, dùng file PNG trích xuất ra từ PSD, ... (... nghĩa là không biết còn cách nào khác hay không)

Ở đây mình dùng XML.
1. Edittext:
 

Bên trái là hình hiển thị, bên phải là layer của nó. Chú ý nó có:
+ Round rectangle nền màu trắng #ffffff (vẽ bằng PS) (cái input (Ac...))
+ Stroke màu #2c81ba (xanh) (nằm ở phần effects>stroke dưới kìa)

Từ đó vào android: tạo 1 file textview_background.xml ở thư mục drawable:
XML code:

    
    
    


Ở đây làm bắt chước lại PS:
+ <solid android:color="#ffffff"/> : vẽ màu trắng
+ <corners android:radius="10dp"/>: góc tròn ở góc hình chữ nhật, 10dp là do mình sửa đổi nhìn cho đẹp chứ nó không hoàn toàn đúng như trong PS.
+ <stroke   android:width="2dp"   android:color="#2c81ba"/>: đường bao với bề dày và màu như PS.

Tóm lại là ở PS có thể vẽ ra các hình khối, đặt màu sắc, đặt opacity (độ đục) cho nó thì vào XML android có thể bắt chước được để làm cho nó giống. Cái lợi trong việc vẽ vời trên PS trước ở chỗ là nó sẽ trực quan hơn, chọn màu dễ dàng hơn (có lẽ thế - mình không phải dân thiết kế, chỉ là dân coding)

2.Tiếp tục tới cái nút ấn
 

Nút phía trên là ở trạng thái bình thường, nút dưới là khi được ấn. Hai trạng thái này được làm khác nhau ở màu nền thôi.
Để làm nó ở android: tạo 1 file btn_background.xml ở thư mục Drawable

XML Code:

    
        
            
            
            
        
    
    
        
            
            
            
        
    


Ở đây dùng <selector> để báo cho hệ thống là đây là 1 drawable phụ thuộc vào trạng thái (pressed, focused, enabled, ...).
Ở đây định nghĩa 2 <item> bên trong:
+ Một cái là <item android:state_pressed="true">, nghĩa là khi ấn vào; bên dưới nó là <shape>, để vẽ vời hình dáng giống như cách đã làm với cái edittext ở trên. Cái nút này khác là có <solid>,<corners>,<padding> nhưng không có <stroke> để vẽ đường bao.
+ Một cái khác chỉ là <item>, nghĩa là ở trạng thái khác thì nó sẽ dùng hình vẽ (<shape>) này.

3. Vẽ cái layout: đặt login_activity.xml trong thư mục layout. Ném vào các edittext, button có android:background="@drawable/....." của các file background đã làm ở trên.
Xong.

Kết quả so sánh: Từ trái sang phải: Photoshop, UI Designer của Intellij IDEA, thực tế trên điện thoại.
 


Có thể không khớp nhau vì mình chưa thực sự chú ý tới tỉ lệ, khoảng cách giữa các thành phần mà mới chỉ để ý màu và hình dáng của từng cái.
Hi vọng ghi chép ngắn gọn này có thể giúp cho ai đó về việc bê giao diện từ photoshop (ai đó thiết kế sẵn rồi) sang XML layout của android.

Cơ bản ở đây là :
+ Tìm được cách làm ra các hình vẽ ở PS và XML layout (như ở trên, vẽ hình chữ nhật, đường bao, nền, góc bo tròn như thế nào)
+ Bắt chước lại PS bằng các đoạn mã XML.
+ Cái nào không bắt chước được thì cắt nó từ PSD thành file PNG và cũng có thể đưa vào XML Layout kia được.

Download file PSD và các file XML ở đây: http://www.mediafire.com/?u26jlhgx9kz5t

Sunday, April 14, 2013

Phát triển chương trình android: váng đầu

Sau chương trình đầu tay là Chương trình chơi nhạc đơn giản, mình bỏ bẵng không học hỏi hay viết thêm chương trình nào nữa (từ tháng 10/2012 tới nay tháng 4/2013, tức là nửa năm). Nguyên nhân là mình quá bận với việc học tiếng, làm luận án thạc sĩ, và linh tinh khác. Dù sao thì lập trình cũng chỉ là thú vui thôi.

Gần đây đột nhiên có ý tưởng mới, mình lại bắt đầu học và viết lập trình cho android. Chương trình lần này yêu cầu phải có server ở PC và client trên điện thoại. Do đó dùng đồng thời Visual Studio C# để làm server trên windows và Intellij IDEA để làm chương trình cho android. Thật ra đầu tiên vẫn dùng Eclipse, nhưng eclipse thường xuyên bị những lỗi quái đản, không rõ nguyên nhân và chạy chậm kinh hoàng nên mới chuyển sang Intellij IDEA. Phần mềm này tốt hơn Eclipse nhiều lần (dù chạy cũng chậm): không hay bị lỗi quái đản, gợi ý mã tốt, hỗ trợ thiết kế UI cho android khá tốt (so với eclipse là tốt hơn nhiều). Còn Netbeans thì mình chưa dùng thử Netbeans nên không biết thế nào.

Nói tới chuyện phát triển chương trình cho android: váng đầu. Đầu tiên là IDE. IDE được giới thiệu chính trên trang developer của android là Eclipse. Nhưng dùng mới thấy phần mềm này quá cồng kềnh và lắm lỗi. Bập vào đấy rồi đúng là ác mộng với những lỗi thì thoảng bị, tắt đi mở lại lại bình thường. Thiết kế giao diện thì không phải hoàn toàn là WYSIWYG. Như mình quen làm việc với Visual Studio sang với android phải bơi trong đống xml để làm UI đúng là váng đầu 1. Đồng ý là nếu quen với xml để làm UI thì đúng là có thể sáng tạo không giới hạn. Nhưng với người mới bắt đầu, làm việc với nó đúng là !@#$%. Bỏ qua IDE, mình giờ đang dùng Intellij IDEA thấy đỡ váng đầu hơn một chút rồi. Phần mềm này cũng chậm rì nhưng soạn thảo tiện lợi hơn rất nhiều. Đặc biệt là bộ thiết kế UI tốt. Người mới dùng nên dùng phần mềm này.

Nhưng sự váng đầu thật ra chưa hết. Mình quen với lập trình trên windows, bập vào android, phải làm quen với một lô lốc các thứ mới (mà cũng đúng thôi vì nó là nền khác): đơn vị - dp, sp, px, in, dùng cái nào ? Trên PC có mỗi pixel thôi. Cái activity/service/ và việc quản lý vòng đời của nó: ví dụ khởi tạo gì đó ở onStart thì nhớ mà tắt nó ở onStop chứ không phải cái khác; nút Back, nút Home mà được ấn thì sự kiện nào sẽ đc gọi (phải biết vì nó liên quan vòng đời activity). Rồi lại còn quản lý threading (cái này giờ mình mới để ý đến vì trước đây làm với windows không cần quan tâm đến nó lắm, tất cả hoạt động xử lý làm trên luồng UI hết).

Nói chung là váng đầu nếu muốn làm lập trình cho android. Nếu mới học lập trình mà lao vào lập trình android thì chắc chắn sẽ ngất. Theo cá nhân thì có lẽ phải nắm vững kỹ thuật lập trình cơ bản (những thứ như hướng đối tượng), biết về Java, XML, thì vào với lập trình cho android mới đỡ được.

Hôm nay thử xem iPhone lập trình thế nào, nhưng tìm vào thấy bộ công cụ của nó chỉ chạy trên máy MAC. Thế thì nghỉ khỏe.

Viết vài dòng sau hơn vài tuần bắt đầu lại với Android. Đây là thú vui đau đầu. ^^

Friday, September 21, 2012

Chương trình chơi nhạc đơn giản (part 3)

Link download chương trình: Google play link
Source code:  source code here at github
Chương trình chơi nhạc đơn giản đã hòm hòm sau một tháng vừa học vừa làm. Mình bổ sung thêm cho chương trình những thứ mà liên quan đến trải nghiệm của người sử dụng:
  • Làm notification ở status bar để người dùng biết service chơi nhạc đang chạy, bài gì đang hát và cho phép ấn vào để vào chương trình chơi nhạc.
  • WAKE_LOCK để máy không rơi vào trạng thái ngủ  (sẽ làm nhạc tắt giữa chừng) trong khi đang nghe nhạc. 
  • Quản lý audio focus để phát hiện ra những tình huống như có điện thoại gọi đến thì tắt nhạc, tin nhắn thông báo đến thì làm nhỏ nhạc lại để người dùng biết.
  • Phát hiện head phone được rút ra để tự động dừng nhạc - không gây ầm ỹ.
Chi tiết những thứ tiểu tiết này có thể xem ở đây: Android developer guide about media playback




Simple music player

Link: Google play
And source code: See source code here at github

So after a month, I finished making this simple music player and learned many things about developing android applications. From knowing nothing, now I could make a simple program. I think it's not bad.

In this program I used this library: HoloEverywhere to make the program looks like ICS.

Screenshot:


Bugfix:
+ 9/10/2012: fix a bug: service auto start if unplug the headphone. Updated to git.



Tuesday, September 18, 2012

Pass data between Activity-Activity and Activity-Service: Singleton

I managed to pass data between activities and service. Now I knew 2 methods:
  • Intent, Bundle: putting something like int, boolean, ... The tricky is when you try to put some complex data like a class. Implement a class with Parcelable interface will solve the problem. But it's rather complex, I don't know how to talk about it. But if you are interested, check this post (not mine):  Android Parcelable Example.
  • Singleton:  You can take advantage of the fact that your application components run in the same process through the use of a singleton. This is a class that is designed to have only one instance. It has a static method with a name such as getInstance() that returns the instance; the first time this method is called, it creates the global instance. Because all callers get the same instance, they can use this as a point of interaction. For example activity A may retrieve the instance and call setValue(3); later activity B may retrieve the instance and call getValue() to retrieve the last set value.
This post only talks about Singleton.

Wednesday, September 5, 2012

Library for android development

I found some good libraries for android. With them applications can be more like ICS, and UI experience much better.

HoloEverywhere

You can use this library to make an application with holo theme just like ICS. Everything from button to seekbar, dialog, ...

ViewPagerExtensions

This library can be used to make pager with tab above. It's just like what you saw in Google Play.

EDIT: 18/9/2012: After working for a while with this library, I found a bug with Swipey tabs. When you try to setCurrentIndex for the viewpager, somehow the tabs display wrong title. I also fixed this problem after 2 days. I made a fork of this github here: ViewPagerExtensions


ActionBarSherlock

This library will add to your application the Action Bar, which was introduced in Honeycomb 3.0 (SDK 11). But you can use it for android 2.x (SDK 7+).




Conclude

Look like they are licensed under Apache License 2.0. Actually I have no idea about this license thing, but I think I will take time to find out. For now, what I do in android developing is just learning.

Ah, this is the UI for the LeMusicPlayer after applied those libraries. Maybe ActionBar will be added a search button, menu. I will not hide my intention to copycat the Google Play Music application interface. After all, I make this application just for learning.

Tuesday, September 4, 2012

Chương trình chơi nhạc đơn giản (part 2)

Tiếp tục nghiên cứu sau khi làm Chương trình chơi nhạc đơn giản (part 1), mình học thêm vài thứ với android và bổ sung vào chương trình. Chủ yếu là tu sửa lại giao diện chương trình, học thêm về cách làm việc với xml trong việc tạo giao diện người dùng cho android:
  • Drag to sort listview: do bauerca làm. Đây là một class kế thừa từ ListView, bổ sung thêm tính năng kéo thả để sắp xếp lại thứ tự của danh sách. Tính năng này rất thích hợp cho playlist.
  • Chơi với xml cùng android (tốn khá nhiều thời gian), nhưng mình cũng đã có cái nhìn tổng quát về cách mà các loại layout, drawable, view làm việc khi thiết kế nó bằng xml.
Đây là giao diện hiện tại của chương trình. Nhìn có vẻ ngon lành cành đào hơn giao diện cũ đấy chứ? 
Giao diện mới
Giao diện cũ
See source code here at github