2010-01-21 29 views
5

Tôi đang làm việc với dự án Flash đầu tiên của mình và đối với trình tải trước của tôi, tôi muốn thực hiện một gradient đơn giản dựa trên tỷ lệ phần trăm được tải. Trình tải trước nói "77% đã tải ...", trong đó số 77 là một phiên bản văn bản động được gọi là percentLoaded. Tôi muốn textColor của percentLoaded thay đổi trên một gradient từ # 000000 thành #FFFFFF, với thang màu xám.Độ dốc RGB dựa trên tỷ lệ phần trăm của tệp được tải

Vì vậy, tôi có thể không chỉ đơn giản làm:

percentLoaded.textColor=(currentValue/100)*0xFFFFFF; 

này chỉ chuyển đổi Format để một bội số của FFFFFF, nhưng kết quả đầu ra một màu sắc vì nó không phải là ba thành phần riêng biệt. Hiện nay, đây là những gì tôi đã có:

percentLoaded.text=currentValue.toString(); 
percentLoaded.textColor=rgb2hex((currentValue/100)*255, (currentValue/100)*255, (currentValue/100)*255); 

đâu "rgb2hex" là một chức năng được xác định trong phạm vi lớp học như vậy:

public function rgb2hex(r:Number, g:Number, b:Number) { 
    return '0x'+(r << 16 | g << 8 | b).toString(16).toUpperCase(); 
} 

Nó không giống như thế này thực sự là thay đổi màu sắc của phông chữ mặc dù. Tôi đã nhập khẩu flash.text.TextField và flash.display.MovieClip, nhưng tôi không chắc chắn nếu tôi thiếu một cái gì đó khác. Điều này sẽ dễ dàng hơn để làm với chuỗi nối? Hoặc là có thể một cái gì đó đang xảy ra với currentValue/100 và đi qua đó như là một số?

Nếu tò mò, tôi đã tìm thấy mã cho rgb2hex here.

Cảm ơn!

Trả lời

6
percentLoaded.textColor=(currentValue/100)*0xFFFFFF; 

này gần.

Để có được một màu xám, bạn thực sự cần phải có mỗi thành phần, nhưng điều này vẫn có thể được thực hiện bằng phương pháp tương tự của bạn:

percentLoaded.textColor = uint((currentValue/100) * 0xFF) * 0x010101; 
+0

Điều này không hiệu quả. thử đặt currentValue thành 1. Bạn nhận được 0x28f5c. bạn cần phải cast ((currentValue/100) * 0xFF) vào một int trước khi nhân với 0x010101. – Ponkadoodle

+0

Đúng, tôi quên mất điều đó, đã sửa; cảm ơn vì đã chú ý điều đó! Các diễn viên thực sự cần phải đi vào kết quả phân chia, vì đó là lý do tại sao nó xảy ra - lớp 'Số' của Flash là một phao IEE. Truyền đến uint nên giải quyết nó. – LiraNuna

+1

Không, giá trị hiện tại là từ 0-100. Nếu bạn cast sau khi chia, nhưng trước khi nhân với 0xFF, bạn sẽ nhận được 0 hoặc 1. Anh ta muốn màu xám đầy đủ, không chỉ đen/trắng. Và vấn đề không phát sinh từ điểm không chính xác nổi. Đó là vì định dạng của bạn (* 0x010101) thực chất là ba trường (01, 01, 01). Nó không mong đợi một cái gì đó trong một lĩnh vực bị ảnh hưởng bởi một lĩnh vực khác. Nhưng sử dụng một giá trị lớn hơn 255, cho phép một trường thấp ảnh hưởng đến một trường cao, và một giá trị giữa các số nguyên cho phép một trường cao ảnh hưởng đến một trường thấp hơn. Hãy thử 1,5 * 0x010101 để xem ý tôi là gì. – Ponkadoodle

1
percentLoaded.textColor = int((currentValue/100) * 0xFF) * 0x010101; 

Việc truyền tới int trước khi nhân với 0x010101 là điều bắt buộc. Giá trị màu 8 bit chỉ có thể là số nguyên từ 0-255. Nếu nó không nằm trong giới hạn này, phép nhân bằng 0x010101 có thể làm cho các số tràn từ một thành phần màu (RR, GG, BB) sang một thành phần màu khác (B-> G, G-> R). Nhưng chúng cũng có thể mang theo cách khác nếu không phải là số nguyên (R-> G, G-> B). Tôi đã giả định currentValue là bất kỳ số nào trong khoảng 0-100.

Xem xét việc này, với mỗi chữ số thành phần màu sắc riêng của nó (trong hệ thập phân):

5.0 * 111 = 555 = 5R, 5G, 5B 
5.5 * 111 = 610.5 = 6R, 1G, 0.5B 
1

Nếu đây làm việc cho bạn

percentLoaded.textColor=(currentValue/100)*0xFFFFFF; 

Sau đó, bạn chỉ có thể làm

var percent = currentValue/100; 
percentLoaded.textColor = Math.floor(percent*0xFF) * 0x010101; 
+0

Điều này không hoạt động. thử đặt currentValue thành 1. Bạn nhận được 0x28f5c. bạn cần truyền đến int trước khi nhân với 0x010101. – Ponkadoodle

+0

@wallacoloo: Đúng vậy, bạn đã sửa. – sberry

3

Bạn đang may mắn, tôi đã thực hiện điều này rất gần đây trong một dự án, chỉ với differe nt màu sắc. Đây là một hàm sẽ trả về một giá trị màu giữa hai màu khác, dựa trên phạm vi 0-1. Tôi nghĩ rằng mã này khá tự giải thích, nhưng hãy cho tôi biết nếu bạn gặp phải bất kỳ vấn đề nào.

private function getBetweenColourByPercent(value:Number = 0.5 /* 0-1 */, highColor:uint = 0xFFFFFF, lowColor:uint = 0x000000):uint { 
    var r:uint = highColor >> 16; 
    var g:uint = highColor >> 8 & 0xFF; 
    var b:uint = highColor & 0xFF; 

    r += ((lowColor >> 16) - r) * value; 
    g += ((lowColor >> 8 & 0xFF) - g) * value; 
    b += ((lowColor & 0xFF) - b) * value; 

    return (r << 16 | g << 8 | b); 
} 

Tyler.

+0

Cảm ơn Tyler, điều này thực sự có thể hữu ích một chút trong khi xuống dòng; Tôi có thể chọn để có các văn bản tải trước đi giữa màu đỏ và trắng, ví dụ. – Rockmaninoff

Các vấn đề liên quan