前两天突然看到网上一款叫Transparentscreen Pro的软件,可以让手机背景变的透明,又搜索了一下才知道,原来QQ以前也有这个效果但是现在好像去掉了。于是我也想实现一下这个效果放在自己的应用中,可是在网上并没有找到教程,那就自己想办法吧,哈哈,其实原理很简单,我却想了好久好久。我们把Activity用FrameLayout布局,底层放一个SurfaceView然后打开摄像头,把画面显示在surfaceview中就OK了,下面看看代码吧
先看布局文件 activity_login.xml
<?xml version="1.0"encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:background="@color/login_bg"> <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:src="@mipmap/ic_launcher" android:layout_width="wrap_content" android:layout_height="72dp" android:layout_marginBottom="24dp" android:layout_gravity="center_horizontal" /> <!-- Email Label --> <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:textColorHint="@color/white"> <EditText android:textColor="@color/white" android:id="@+id/input_phonenumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textEmailAddress" android:hint="@string/phonenumber"/> </android.support.design.widget.TextInputLayout> <android.support.v7.widget.AppCompatButton android:id="@+id/btn_login" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:layout_marginBottom="24dp" android:padding="12dp" android:background="@color/light_blue" android:text="@string/login" android:textColor="@color/white" /> <TextView android:id="@+id/link_signup" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="24dp" android:text="@string/register" android:gravity="center" android:textSize="16dip" android:textColor="@color/white"/> </LinearLayout> </FrameLayout> 接着是Activity中的代码,有关surfaceview的用法这里不多说了,大家可以在别处学习一下package com.example.baoqian.myrank; import android.app.Activity; import android.content.Intent; import android.hardware.Camera; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v7.widget.AppCompatButton; import android.view.Display; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.example.baoqian.bean.User; import com.example.baoqian.myinterface.ActivityInterface; import java.io.IOException; import java.util.HashMap; import cn.bmob.v3.listener.SaveListener; /** * Created by baoqian on 2017/7/8. */ public class LoginActivity extends Activity implements ActivityInterface,View.OnClickListener,SurfaceHolder.Callback{ private TextView link_signup; private AppCompatButton btn_login; private EditText input_phonenumber; private Camera mCamera; private SurfaceHolder mHolder; private SurfaceView mView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); initView(); initListener(); } @Override public void initView() { link_signup= (TextView) findViewById(R.id.link_signup); btn_login= (AppCompatButton) findViewById(R.id.btn_login); input_phonenumber= (EditText) findViewById(R.id.input_phonenumber); mView = (SurfaceView) findViewById(R.id.surfaceView); mHolder = mView.getHolder(); mHolder.addCallback(this); } @Override public void initListener() { link_signup.setOnClickListener(this); btn_login.setOnClickListener(this); } @Override public void initData() { } @Override public void onClick(View v) { switch (v.getId()) { case R.id.link_signup: break; case R.id.btn_login: break; default: break; } } @Override // apk暂停时执行的动作:把相机关闭,避免占用导致其他应用无法使用相机 protected void onPause() { super.onPause(); mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } @Override // 恢复apk时执行的动作 protected void onResume() { super.onResume(); if (null!=mCamera){ mCamera = getCameraInstance(); try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch(IOException e) { } } } @Override protected void onDestroy() { super.onDestroy(); mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } // SurfaceHolder.Callback必须实现的方法 public void surfaceCreated(SurfaceHolder holder){ mCamera = getCameraInstance(); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch(IOException e) { } } // SurfaceHolder.Callback必须实现的方法 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){ refreshCamera(); int rotation = getDisplayOrientation(); //获取当前窗口方向 mCamera.setDisplayOrientation(rotation); //设定相机显示方向 } // SurfaceHolder.Callback必须实现的方法 public void surfaceDestroyed(SurfaceHolder holder){ mHolder.removeCallback(this); mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } public static Camera getCameraInstance(){ Camera c = null; try { c = Camera.open(); } catch(Exception e){ } return c; } private int getDisplayOrientation(){ WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); int rotation = display.getRotation(); int degrees = 0; switch (rotation){ case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } android.hardware.Camera.CameraInfo camInfo = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, camInfo); int result = (camInfo.orientation - degrees + 360) % 360; return result; } private void refreshCamera(){ if (mHolder.getSurface() == null){ return; } try { mCamera.stopPreview(); } catch(Exception e){ } try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e) { } } }
最后来一张效果图