老規(guī)矩,先上圖
演示中用的是CardView嵌套的ListView,背景是攝像頭试幽,接下來說實現(xiàn)氏义。理論上所有的View都能這么玩
講一下大體邏輯,很簡單窗慎,監(jiān)聽水平儀來動態(tài)改變來動態(tài)設置View的位置物喷,接下來帖代碼。
相機處理用的是自己封裝的工具遮斥,喜歡的可以拿去用
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager sensorManager;
private Sensor defaultSensor;
private static final String TAG = "MainActivity";
private SurfaceView sfv;
private CardView cv;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//獲得傳感器管理
defaultSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);//設置類型
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, defaultSensor, SensorManager.SENSOR_DELAY_GAME);//注冊傳感器
}
@Override
protected void onDestroy() {
super.onDestroy();
sensorManager.unregisterListener(this);//注銷傳感器
CameraUtils.getInstance().closeCamera(sfv,MainActivity.this);//釋放攝像頭
}
@Override
public void onSensorChanged(SensorEvent event) {
changeLocation(event.values[1], event.values[2]);
}
private void changeLocation(float y, float z) {
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) cv.getLayoutParams();
layoutParams.setMargins((int) z * 2, (int) y * 2, 0, 0);//乘2的作用是為了讓效果明顯點
cv.setLayoutParams(layoutParams);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
private void initView() {
sfv = (SurfaceView) findViewById(R.id.sfv);
cv = (CardView) findViewById(R.id.cv);
lv = (ListView) findViewById(R.id.lv);
CameraUtils.getInstance().openCamera(sfv,MainActivity.this);//打開相機
lv.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return 10;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = View.inflate(getApplicationContext(),R.layout.item,null);
}
return convertView;
}
}
}
添加權限
<uses-permission android:name="android.permission.SENSOR_INFO" />
<uses-permission android:name="android.permission.SENSOR_ENABLE" />
Demo地址:https://github.com/bertsir/FloatView
幫助到你了希望給個Start,有問題下面留言峦失,會回復