美圖秀秀-美化圖片之【背景虛化】界面設計

来源:http://www.cnblogs.com/salam/archive/2016/01/14/5130668.html
-Advertisement-
Play Games

本文是背景虛化界面設計,在美圖秀秀的背景虛化模塊主要是圖像的模糊處理,可以按照圓形和線性進行模糊處理,並生成選定的形狀。 在開發中遇到的誤區1.模糊形狀使用UIImageView,遇到一些麻煩,即使你向UIImageView對象添加手勢,當你重載touchesBegan時,UIImageVie...


  本文是背景虛化界面設計,在美圖秀秀的背景虛化模塊主要是圖像的模糊處理,可以按照圓形和線性進行模糊處理,並生成選定的形狀。

  在開發中遇到的誤區

1.模糊形狀使用UIImageView,遇到一些麻煩,即使你向UIImageView對象添加手勢,當你重載touchesBegan時,UIImageView對象也接收不到觸摸事件,而是直接傳遞給self.view。所以最後使用了UIButton來顯示模糊形狀圖片,這樣方便我們接收事件。

2.UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];初始化時用UIButtonTypeCustom才可以顯示原圖片,否則顯示圖片時時高亮狀態的圖片,很是奇怪。

如圖

先來幾張效果圖

  

 

一、從美化圖片首頁進入背景虛化

    else if ([text isEqualToString:@"背景虛化"])
    {
        FWBlurViewController *vc = [[FWBlurViewController alloc] initWithImage:self.image];
        [self presentViewController:vc animated:YES completion:^{
        }];
    }

 

二、初始化界面

self.selectedIndex = 0;
    
    self.view.backgroundColor = [UIColor blackColor];
    
    //顯示圖片
    self.imageView = [[UIImageView alloc] initWithImage:self.image];
    self.imageView.frame = CGRectMake(0, 0, WIDTH, HEIGHT - 115);
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    [self.view addSubview:self.imageView];
    
    //保存與取消按鈕的添加
    UIImage *i1 = [UIImage imageNamed:@"[email protected]"];
    self.btnClose = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.btnClose setImage:i1 forState:UIControlStateNormal];
    self.btnClose.frame = CGRectMake(20, HEIGHT - kCancelHeight - 10, kCancelHeight, kCancelHeight);
    [self.btnClose addTarget:self action:@selector(btnCancelOrSaveClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.btnClose];
    
    UIImage *i2 = [UIImage imageNamed:@"[email protected]"];
    self.btnSave = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.btnSave setImage:i2 forState:UIControlStateNormal];
    self.btnSave.frame = CGRectMake(WIDTH - kCancelHeight - 20, HEIGHT - kCancelHeight - 10, kCancelHeight, kCancelHeight);
    [self.view addSubview:self.btnSave];
    [self.btnSave addTarget:self action:@selector(btnCancelOrSaveClicked:) forControlEvents:UIControlEventTouchUpInside];
    
    [self setupSlider];
    
    self.styleBar = [[FWEffectBar alloc] initWithFrame:CGRectMake(90, HEIGHT - 55, 180, 55)];
    
    NSDictionary *autoDict = [[FWDataManager getDataSourceFromPlist] objectForKey:@"Blur"];
    NSArray *normalImageArr = [autoDict objectForKey:@"normalImages"];
    NSArray *hightlightedImageArr = [autoDict objectForKey:@"HighlightedImages"];
    NSArray *textArr = [autoDict objectForKey:@"Texts"];
    
    NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:0];
    
    for (int i = 0; i < [textArr count]; i++)
    {
        FWEffectBarItem *item = [[FWEffectBarItem alloc] initWithFrame:CGRectZero];
        [item setFinishedSelectedImage:[UIImage imageNamed:[hightlightedImageArr objectAtIndex:i]] withFinishedUnselectedImage:[UIImage imageNamed:[normalImageArr objectAtIndex:i]] ];
        item.title = [textArr objectAtIndex:i];
        [items addObject:item];
    }
    self.styleBar.items = items;
    self.styleBar.effectBarDelegate = self;
    [self.styleBar setSelectedItem:[self.styleBar.items objectAtIndex:0]];
    [self effectBar:self.styleBar didSelectItemAtIndex:0];
    [self.view addSubview:self.styleBar];
    
     self.btnBlurType = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.btnBlurType setImage:[UIImage imageNamed:@"icon_blur_null"] forState:UIControlStateNormal];
    [self.btnBlurType addTarget:self action:@selector(btnBlurClicked:) forControlEvents:UIControlEventTouchUpInside];
    self.btnBlurType.frame = CGRectMake(20, HEIGHT - 90, 30, 30);
    [self.view addSubview:self.btnBlurType];

 

 

三、模糊形狀視圖管理

- (void)btnBlurClicked:(id)sender
{
    if (self.subView)
    {
        return;
    }
    
    [self setupSharpView];
}

- (void)hideShapeView
{
    [self.subView removeFromSuperview];
    self.subView = nil;
}
- (void)setupSharpView
{
    NSArray *arr = [NSArray arrayWithObjects:@"icon_blur_null", @"icon_blur_center", @"icon_blur_heart", @"icon_blur_star", @"icon_blur_heptagon", nil];
    self.subView = [[UIView alloc] initWithFrame:CGRectMake(10, HEIGHT - 135, 250, 35)];

    for (int i = 0; i < [arr count]; i++) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [btn setImage:[UIImage imageNamed:[arr objectAtIndex:i]] forState:UIControlStateNormal];
        btn.frame = CGRectMake(10 + (35 + 10) * i, 0, 35, 35);
        [btn addTarget:self action:@selector(tap:) forControlEvents:UIControlEventTouchUpInside];
        [self.subView addSubview:btn];
    }
    
    [self.view addSubview:self.subView];
}

- (void)tap:(id)sender
{
    [self hideShapeView];
    
    [self.btnBlurType setImage:((UIButton *)sender).currentImage forState:UIControlStateNormal];
}


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self hideShapeView];
}

 

 

小知識

1.[self.slider setThumbImage:[UIImage imageNamed:@"icon_slider_thumb"] forState:UIControlStateNormal];這段代碼可以修改UISLIDER的滑塊圖片,預設的滑塊太大~

2.UIImageView攔截事件要弱於UIButton

3.推薦創建UIButton時類型選擇UIButtonTypeCustom。

 

界面做完主攻具體功能實現了,估計還得1個星期左右~

下載項目

 

 

 

 

為自己加油!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、Gooflow特點1.1 跨瀏覽器可相容IE7--IE10, FireFox, Chrome, Opera等幾大內核的瀏覽器,且不需要瀏覽器再加裝任何控制項。1.2 多系統相容性、可移植性由於只包括前臺UI,因此二次開發者可很方便將本插件用在任何一種需要流程圖的B/S系統應用上,流程圖的詳細實現邏...
  • /** 判斷是否是快速點擊 */ private static long lastClickTime; public static boolean isFastDoubleClick() { long time = System.currentTimeMillis(...
  • 如圖設置的一種引導頁的開啟這個引用時先將圖片進行一個動畫當動畫結束時進入到了引導頁面 下麵的小圖片 當點擊的時候ViewPager消失 再點擊時ViewPager在顯示出來先看開啟界面 上面的動畫還是值得借鑒的package com.demo.activity;import com.demo.pul...
  • 1. 添加一個Target這裡是添加一個Test 項目這裡添加新的targetTest與Release 也是同上的操作
  • 1 查看遠程分支123456789101112131415$ git branch -a* br-2.1.2.2masterremotes/origin/HEAD -> origin/masterremotes/origin/br-2.1.2.1remotes/origin/br-2.1.2.2re...
  • 關於Core Data的一些整理(一)在Xcode7.2中只有Mast-Debug和Single View中可以勾選Use Core Data如果勾選了Use Core Data,Xcode會自動在AppDelegate中幫你生成Core Data的核心代碼,並且自動生成.xcdatamodeld數...
  • Cocoapods安裝步驟1.升級Ruby環境sudo gem update --system如果Ruby沒有安裝,請參考如何在Mac OS X上安裝 Ruby運行環境2.安裝CocoaPods時我們要訪問cocoapods.org,用淘寶的RubyGems鏡像來代替官方版本,執行以下命令:$ ge...
  • 關於NSURL的一些屬性的記錄 1 NSLog(@"%@", request.URL.absoluteString); 2 NSLog(@"%@", request.URL.relativeString); 3 NSLog(@"%@", request.URL.scheme); 4 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...