พฤศจิกายน 22, 2017, 10:54:35 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: How to Get The Drawable Screen/Canvas Size  (อ่าน 19441 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« เมื่อ: ธันวาคม 12, 2012, 01:46:13 pm »

How to Get The Drawable Screen/Canvas Size

การแสดงผลแบบ Full-Screen (และแบบอื่นๆ) ในทุก Application ไม่ว่าจะเป็นบ Computer หรือบน Mobile Device สิ่งที่มีความจำเป็นที่จะต้องทราบเป็นอันดับแรกคือขนาดของหน้าจอแสดงผล ซึ่งทราบได้จากหลากหลายวิธีการ เช่นอ่านจากคู่มือ เขียนโปรแกรมวาดแส้นตรงๆ แล้วพิจารณาจากจำนวน Pixel ที่ได้วาดลงไป เมื่อทราบแล้ว จึงทำการออกแบบ รูปร่าง และตำแหน่งของการแสดงผลกันต่อไป
แต่... ปัจจุบันขนาดของหน้าจอหลากหลายอย่างมาก บ่อยครั้งขนาดเท่ากัน แต่ความหนาแน่นไม่เท่ากัน ก็ส่งปัญหาให้การแสดงผลของ application เล็กไปบ้าง ใหญ่ไปบ้าง ล้นจอบ้าง ฯลฯ ซ้ำร้ายไปกว่านั้น หน้าจอยังปรับแกน x,y ตามรูปแบบการถือของผู้ใช้อีกด้วย เพื่อหลีกเลี่ยงปัญเหล่านี้ เราในฐานนะผู้เขียนโปรแกรมมีความจำเป็นอย่างหลีกเลี่ยงไม่ได้ที่จะต้องเขียนโปรแกรมให้โปรแกรมรับรู้ขนาดของจอแสดงผล ในขณะที่โปรแกรมทำงาน เพื่อให้การวาดส่วนต่างๆ ออกมาในตำแหน่งที่ต้องการและถูกต้องเหมาะสม

ยกตัวอย่างโจทย์ เพื่อให้เห็นปัญญหาในรับดับปฏิบัติ
- ต้องการวาดสัญญาณ sine wave จำนวน 10 cycle
- สัญญาณมี amplitude (Vp-p) 100 mV (บน/ล่าง อย่างละ 50 mV) โดยที่ 1 pixel แทน 1 mV
- จำนวนจุดของสัญญาณทั้งหมด (ทั้ง 10 Cycle) ในแกนเวลา มากที่สุดเท่าที่เป็นไปได้ นั่นคือจะเท่ากับจำนวน Pixel ในแนวแกน x ของจอ

ผลที่ต้องการตามรูป


 

ข้อสังเกตคือ เมื่อจอวางในแนวตั้ง ความยาวของแกน x จะน้อยกว่า เมื่อจอวางในแนวนอน
ในที่นี้ขนาดของจอขนาด 800*1280 หรืออาจจะมองเป็น 1280*800 เพราะหมุนไปมาครั้งละ 90 องศาได้
** สิ่งที่ต้องทราบสำหรับ Android Programmer คือ พื้นที่แกนตั้งจะถูกใช้เป็น Quick Launch (ส่วนที่แสดง ตวามแรงสัญญาณ แบตเตอร์รี่ นาฬากา ฯลฯ) เพราะฉนั้นจะมีพื้นที่ของแกน y สำหรับการวาดไม่เต็ม นั่นคือขนาดของจอจะกลายเป็น 800-H*1280 หรืออาจจะมองเป็น 1280-H*800 เมื่อ H คือความสูงของ Quick Launch
อย่างไรก็ตามขนาดของ H ไม่ใช่สาระสำคัญ เพราะการวาดใดๆ ลงไป เราจะไม่ไปวาดทับพื้นที่ส่วนนี้ แต่ถ้าอ่านขนาดของจอมาจาก datasheet จะเกิดปัญหาทันที เพราะเราไม่ทราบค่า H และค่า H นี้ก็แตกต่างกันออกไปตาม Theme และ เวอร์ชั่นที่ใช้ด้วย ***

การหาขนาดของพื้นที่สำหรับวาด หรือ Canvas ของจอ มีหลากหลายวิธี ในที่นี้จะยกตัวอย่างวิธีที่นิยมใช้กันทั่วไป


ตัวแปรต่างๆ ที่จะใช้สำหรับตัวอย่างทั้งหมด
Code: (java)
Display display = null;
WindowManager window = null;
DisplayMetrics metrics = null;
int w=0, h=0;


วิธีที่ 1
Code: (java)
 display = getWindowManager().getDefaultDisplay();
 w = display.getWidth();
 h = display.getHeight();
 Log.i("Santi", "w=" + w + ", h=" + h);

หรือ
Code: (java)
w  = getWindowManager().getDefaultDisplay().getWidth();
h = getWindowManager().getDefaultDisplay().getHeight();
Log.i("Santi", "width=" + w + ", height=" + h);




วิธีที่ 2
Code: (java)
window = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
display = window.getDefaultDisplay();
w = display.getWidth();
h = display.getHeight();
Log.i("Santi", "w=" + w + ", h=" + h);

เช่นเดียวกันกับวิธีที่ 1 วิธีนี้ก็สามารถย่อเป็นแบบสั้น ได้เช่นกัน ในที่นี้ขอละไว้



วิธีที่ 3
Code: (java)
metrics = getApplicationContext().getResources().getDisplayMetrics();
w = metrics.widthPixels;
h = metrics.heightPixels;
Log.i("Santi", "w=" + w + ", h=" + h);

แน่นอน ย่อเป็นแบบสั้นได้เช่นกัน



มีบ่อยครั้งที่เราต้องการทราบขนาดของ Display Scale หรือความหนาแน่ของ Pixel สามารถทำได้โดย
Code: (java)
final float den = this.getResources().getDisplayMetrics().density;
Log.i("Santi", "Density=" + den);

*** pixels*DisplayMetrics.density = dip ***



ผลที่ได้ของทุกตัวอย่าง รวมการวางจอทั้งในแบบแนวตั้ง และแนวนอนดังนี้:




ในที่นี้จะเห็นว่าขนาดของ H ที่ได้กล่าวไปก่อนหน้าเท่ากับ
1280 - 1232 = 48
หรือ
800 - 752 = 48



รู้ว่ากระดาษวาดเขียนขนาดเท่าไร รู้ว่าต้องการวาดอะไรลงไปในนั้น ก็จะสามารถวางแผนการวาดได้อย่างถูกต้องเม่นยำ

ฝากให้คิด:
ให้วาดรูป sine wave ตามที่ได้แสดงในรูปด้านบน แต่ให้ peak ของสัญญาณทั้งด้านบวกและลบ สัมผัสกับขอบจอพอดี
(Peak บวก สัมผัสของจอด้านบน, Peak ลบ สัมผัสขอบของ Quick Launch)
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: