【转】如何实现TextureView或者SurfaceView 预览框为圆角

转载自:如何实现TextureView或者SurfaceView 预览框为圆角


项目中,视频预览界面框为圆角;但发现是使用的Renderer渲染的方法进行的,的确可以有圆角效果。

但有个问题是:我的视频源与要显示视频的预览框的长宽比率不同,预览框需要满屏看到视频源,如果不做处理,视频源只能通过压缩来显示。造成了视频的变形,如果不拉伸处理,那么就进行裁剪处理,需要对视频进行Matrix操作,如移动,伸缩处理。进行这些处理后,渲染的圆角效果就不再出现了。所以通过Renderer来进行圆角效果,不但复杂而且并不可靠。

通过网上的搜索可以找到Android5.0后,一个类ViewOutlineProvider;基于View自身的setClipToOutline(boolean clipToOutline)和setOutlineProvider(ViewOutlineProvider provider)方法实现了该需求。

import android.graphics.Outline;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewOutlineProvider;

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都可通过此方法达到圆角效果。

Android自定义拍照实现

节选自:Android自定义拍照实现


/**
 * 注释:拍照并保存图片到相册
 * 时间:2019/3/1 0001 15:37
 * 作者:郭翰林
 */
private void takePhoto() {
    isTakePhoto = true;
    //调用相机拍照
    mCamera.takePicture(null, null, null, (data, camera1) -> {
        //视图动画
        mPhotoLayout.setVisibility(View.GONE);
        mConfirmLayout.setVisibility(View.VISIBLE);
        AnimSpring.getInstance(mConfirmLayout).startRotateAnim(120, 360);
        imageData = data;
        //停止预览
        mCamera.stopPreview();
    });
}

使用TextView替代Button,使用ImageView替代ImageButton

Button继承自TextView,ImageButton继承自ImageView。

<TextView
    android:id="@+id/nextBtn"
    android:layout_width="250dp"
    android:layout_height="80dp"
    android:background="@drawable/bg_0062ec_40"
    android:gravity="center"
    android:text="下一步"
    android:textColor="#FFFFFF"
    android:textSize="34sp" />
<ImageView
    android:id="@+id/backBtn"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:scaleType="center"
    app:srcCompat="@drawable/icon_back" />

【转】Android中TextView与Button的区别

转载自:Android中TextView与Button的区别


Button继承于TextView,一般情况下,TextView用来承载静态文本,Button用来响应点击事件。但是TextView 继承自View,点击事件是从View就有的特性,所以TextView也能点击。那么TextView与Button有什么不同呢?

1.TextView中文字默认是从左上方开始,Button中文字默认是居中显示

2.TextView默认背景透明,Button默认背景灰色的

3.TextView点击无效果,Button默认状态下点击变黄色(它有一个默认的背景选择器)

4.TextView默认不拦截点击事件,Button会拦截点击事件(比如说我们一个ListView,Item的布局中有一个TextView和Button,我们在这个TextView上点击会触发ListView的OnItemClickListener方法,在Button上点击并不会触发ListView的OnItemClickListener方法,因为Button把这个点击事件拦截了)。

Android Context完全解析

节选自:Android Context完全解析,你所不知道的Context的各种细节


Context一共有三种类型,分别是Application、Activity和Service。

Context数量 = Activity数量 + Service数量 + 1

上面的1代表着Application的数量,因为一个应用程序中可以有多个Activity和多个Service,但是只能有一个Application。

Application单例模式:

public class MyApplication extends Application {

    private static MyApplication app;

    public static MyApplication getInstance() {
        return app;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        app = this;
    }
}

gRPC请求中对header进行处理

节选自:gRPC请求中对header进行处理


1.[Android (Java)]

1.1只设置客户端请求时附带的header

见类 io.grpc.stub.MetadataUtils,其中有个方法:

/**
 * Attaches a set of request headers to a stub.
 *
 * @param stub to bind the headers to.
 * @param extraHeaders the headers to be passed by each call on the returned stub.
 * @return an implementation of the stub with {@code extraHeaders} bound to each call.
 */
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1789")
public static <T extends AbstractStub<T>> T attachHeaders(
        T stub,
        final Metadata extraHeaders) {
    return stub.withInterceptors(newAttachHeadersInterceptor(extraHeaders));
}

稍微自己封装一下的效果,如下:

private static <T extends AbstractStub<T>> T attachHeaders(T stub, final Map<String, String> headerMap) {
    Metadata extraHeaders = new Metadata();
    if (headerMap != null) {
        for (String key : headerMap.keySet()) {
            Metadata.Key<String> customHeadKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
            extraHeaders.put(customHeadKey, headerMap.get(key));
        }
    }
    return MetadataUtils.attachHeaders(stub, extraHeaders);
}

使Glide支持https

添加依赖

// Glide
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation 'com.github.bumptech.glide:okhttp3-integration:4.11.0'

然后就可以了,添加 OkHttp 集成库的 Gradle 依赖将使 Glide 自动开始使用 OkHttp 来加载所有来自 http 和 https URL 的图片。


参考链接:

关于集成库

OkHttp3

关于Glide配置https图片不显示的问题

Glide3.8升级到Glide4.0.0