如何實現TextureView或者SurfaceView 預覽框為圓角
阿新 • • 發佈:2019-01-23
專案中,視訊預覽介面框為圓角;但發現是使用的Renderer渲染的方法進行的,的確可以有圓角效果。
但有個問題是:我的視訊源與要顯示視訊的預覽框的長寬比率不同,預覽框需要滿屏看到視訊源,如果不做處理,視訊源只能通過壓縮來顯示。造成了視訊的變形,如果不拉伸處理,那麼就進行裁剪處理,需要對視訊進行Matrix操作,如移動,伸縮處理。進行這些處理後,渲染的圓角效果就不再出現了。所以通過Renderer來進行圓角效果,不但複雜而且並不可靠。
通過網上的搜尋可以找到Android5.0後,一個類ViewOutlineProvider;基於View自身的setClipToOutline(boolean clipToOutline)和setOutlineProvider(ViewOutlineProvider provider)方法實現了該需求。
任何View都可通過此方法達到圓角效果。
但有個問題是:我的視訊源與要顯示視訊的預覽框的長寬比率不同,預覽框需要滿屏看到視訊源,如果不做處理,視訊源只能通過壓縮來顯示。造成了視訊的變形,如果不拉伸處理,那麼就進行裁剪處理,需要對視訊進行Matrix操作,如移動,伸縮處理。進行這些處理後,渲染的圓角效果就不再出現了。所以通過Renderer來進行圓角效果,不但複雜而且並不可靠。
通過網上的搜尋可以找到Android5.0後,一個類ViewOutlineProvider;基於View自身的setClipToOutline(boolean clipToOutline)和setOutlineProvider(ViewOutlineProvider provider)方法實現了該需求。
public class TextureVideoViewOutlineProvider extends ViewOutlineProvider { private float mRadius; public TextureVideoViewOutlineProvider(float radius) { this.mRadius = radius; } @Override public void getOutline(View view, Outline outline) { Rect rect = new Rect(); view.getGlobalVisibleRect(rect); int leftMargin = 0; int topMargin = 0; Rect selfRect = new Rect(leftMargin, topMargin, rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin); outline.setRoundRect(selfRect, mRadius); } }
mView.setOutlineProvider(new TextureVideoViewOutlineProvider(radius));
mView.setClipToOutline(true);
任何View都可通過此方法達到圓角效果。