2013-07-11 2 views
0

Я пытаюсь достичь эффекта уровня заряда батареи, используя изображение обычной батареи, изображение с обрезанным рисунком, основанное на текущем уровне заряда батареи.Обрезание и размещение изображения для достижения эффекта уровня заряда аккумулятора

На данный момент я могу изменить цвет изображения пустой батареи, но я не знаю, как обрезать, новый и поместить его поверх оригинала.

Я нашел несколько полезных ссылок о том, как обрезать, но каждый из них обрезает верхний левый угол изображения. Я хотел бы иметь в качестве начальной точки нижний левый и установить высоту в соответствии с текущим уровнем.

Кроме того, можно комбинировать или поместить обрезанное изображение поверх оригинала?

Это мое оригинальное изображение.

enter image description here

... и что я пытаюсь достичь

enter image description here

На данный момент я пытаюсь этот код,

int width = emptyBm.size.width; 
int height = fullBm.size.height * level/100; 

UIImage *image = [UIImage imageNamed:@"battery_icon"]; 
UIImage *image2 = [UIImage imageNamed:@"battery_icon_full"]; 

CGRect rect = CGRectMake(0, image.size.height-height, width, height); 
CGImageRef imageRef = CGImageCreateWithImageInRect([image2 CGImage], rect); 

CGImageRef actualMask = CGImageMaskCreate(CGImageGetWidth([image CGImage]), 
               CGImageGetHeight([image CGImage]), 
               CGImageGetBitsPerComponent([image CGImage]), 
               CGImageGetBitsPerPixel([image CGImage]), 
               CGImageGetBytesPerRow([image CGImage]), 
               CGImageGetDataProvider([image CGImage]), NULL, false); 
CGImageRef masked = CGImageCreateWithMask(imageRef, actualMask); 

batteryBackground.image = [UIImage imageWithCGImage:masked]; 

Однако, так как я использую CGImageCreateWithImageInRect обрезанная часть вытянутая

+0

Ну начиная с нижнего левого угла означает, что, исходя из значения изображения высоты минус " высота "используемой детали. Это простая математика, определяющая ваш CGRect. – shadowhorst

+0

Ну, я действительно понял, что сказал shadowhorst после публикации моего примера кода. Достаточно пересчитать CGRect, вычитая использованную часть, если изображение вашей зеленой батареи уже имеет форму и прозрачность. Просто не забудьте установить его contentMode на не растягивающийся. Пример, который я описал, также должен использоваться, но не оптимален, если вы не хотите использовать прозрачный зеленый прямоугольник в качестве индикатора заполнения. – basar

ответ

2

Используйте изображение с серой батареей в качестве маски. Создайте зеленый прямоугольник и примените созданную вами маску. Вот ссылка на IOS маскирования: link

EDIT: Я надеюсь, что это работает (не проверено):

int width = emptyBm.size.width; 
int height = fullBm.size.height * level/100; 

UIImage *image = [UIImage imageNamed:@"battery_icon"]; 
UIImage *image2 = [UIImage imageNamed:@"battery_icon_full"]; 

// For clarity, just pretend the mask method I gave link to you is defined in your class. 
UIImage *maskedImage = [self maskImage:image2 withMask:image]; 

// I assume the two imageviews are already connected to outlets. 
self.backgroundImageView = [[UIImageView alloc] initWithImage:image]; 
self.foregroundImageView = [[UIImageView alloc] initWithImage:maskedImage]; 

// Make it's image stick to bottom so it won't stretch. 
self.foregroundImageView.contentMode = UIViewContentModeBottom; 

// Then calculate the frame again to reflect changes of battery status. 
CGRect rect = self.backgroundImageView.frame; 
rect.size.height = height; 
// Push the masked imageview a to bottom as amount of missing battery height. 
rect.origin.y = rect.origin.y + self.backgroundImageView.frame.size.height - height; 
self.foregroundImageView.frame = rect; 
+0

Я обновил свой вопрос, с попыткой – OutOfBoundsException

+0

Я разработал решение с похожим на это способом! Спасибо. :) – OutOfBoundsException

Смежные вопросы