[Framer] 讓你的原型會拍照片
一、給按鈕圖層添加 input 標籤
開始之前,我們應該已經有了一個基本的 UI 框架,最基本的元素包括一個照片的顯示區域和一個拍照按鈕,顯然這時候我們的原型是啥也幹不了的。
這時,為了讓我們的原型可以和瀏覽器上傳文件的 api 做對接,我們要給相機的按鈕添加一個 html 的 input 標籤。標籤的詳細定義可以看這裡:HTML <input> 標籤。cameraButton.html="""n <input type="file" id="btn" accept="image/*"/>n"""n
增加了上面的代碼後,我們可以很快發現,相機按鈕的圖層上多出了一個選擇文件的按鈕。雖然在 Preview 區域點擊是沒有效果的,但如果大家有興趣 Mirror 到手機,就會發現,點擊這個小小的「Choose File」已經可以進行拍照和圖片選擇了——似乎目標已經完成了??
顯然,這個時候原型的樣子和功能還遠遠算不上完美,接下來,我們要對 input 元素進行功能和樣式上的修飾。
二、設置 CSS 樣式去掉惱人的文案
cameraButton.html="""n <input type="file" id="btn" accept="image/*"/ stylex="opacity: 0">n"""n
僅僅在標籤內增加了「stylex="opacity: 0"」後,界面清凈了,通過 CSS 樣式設置 input element 的透明度,原來難看簡陋的按鈕消失不見了,我們簡潔可愛的相機按鈕又回來了。
三、鏈接點擊事件
去掉了難看按鈕,一定很快就會發現,隨著按鈕的消失,原來本身就很小的按鈕觸區也跟著一起看不見了,雖然能點,卻像穿針引線。因此,我們需要將按鈕圖層的點擊事件和 input 元素的按鈕點擊事件鏈接起來。
input = document.getElementById("btn")n
首先,我們將通過 getElementById 將 dom 節點引入,方便之後對 input 元素的控制。關於這個方法我們可以參考:HTML DOM getElementById() 方法
cameraButton.on Events.Click, ->n input.click()n
再次參考 input 的事件定義,配合上面這句,我們就成功地給 input 綁定了相機按鈕的點擊事件,試試 Mirror 後點擊相機按鈕,感受一下完美的觸區吧~
四、回傳圖片數據
只能拍照不能看的相機,肯定在功能上還不夠完美,因此,我們需要把拍到或者上傳的圖片數據回傳並顯示到預計區域中。 在這裡我們需要用到 FileReader 介面 。
imageReader = ->n file = input.files[0]n reader = new FileReader()n reader.readAsDataURL filen reader.onload = ->n show.image = reader.resultn
首先,我們先定義方法 imageReader,在這個方法中,我們提取 input 元素中讀取圖片文件給 file 賦值,並建立 FileReader 實例,通過 readAsDataURL 方法對 file 進行讀取。而在讀取完成後觸發 onload 後,便把讀取的圖片數據 reader.result 傳送給 showImage 圖層。
input.onchange = ->n imageReader()n
最後只要像上面,在 input 元素的「onchange 事件」觸發時,調用我們定義的方法,就可以實現讀取並顯示圖片效果了。
最後還是附上:線上瀏覽和源碼地址(4.25 更新修正適配問題)
推薦閱讀:
※UI設計中關於設計規範、切圖和尺寸的幾點疑問?
※《原子設計》第三章:常用工具
※交互動效乾貨——想做點 UI Motion Design,如何開始?(入門推薦)