水平气泡显示
水平气泡用于显示设备水平倾角值,便于查看设备是否歪斜和整平。
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:theme="@android:style/Theme.Dialog">
<ImageView
android:id="@+id/imageViewTilt"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentBottom="false"
android:layout_centerHorizontal="false"
android:layout_marginBottom="@dimen/activity_horizontal_margin"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="@dimen/activity_horizontal_margin"
android:contentDescription="@string/tilt_picture"
app:srcCompat="@drawable/tilt"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/textViewLine"
android:layout_width="200dp"
android:layout_height="2dp"
android:layout_below="@+id/imageViewTilt"
android:layout_centerHorizontal="true"
android:background="@android:color/background_dark"
android:text="TextView" />
<TextView
android:id="@+id/textViewTiltangle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textViewLine"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:text="@string/nothing"
android:textColor="@android:color/black" />
<ImageView
android:id="@+id/imageViewBubble"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerHorizontal="false"
android:layout_centerInParent="false"
android:contentDescription="@string/bubble_picture"
app:srcCompat="@drawable/bubble_white" />
</RelativeLayout>
代码
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AlertDialog;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.****.**.Defines;
import com.example.****.**.HttpConnection;
import com.example.****.**.MainActivity;
import com.example.****.**.R;
import java.text.DecimalFormat;
import static android.os.SystemClock.sleep;
/**
* Created by song on 2017/3/31.
*/
public class MyDialogTilt extends Dialog {
private ImageView mImageBubble;
private ImageView mImageDevice;
private TextView mTextViewTilt;
private boolean mDialogShowing;
private Context mContext;
public MyDialogTilt(Context context) {
super(context);
mContext = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tiltangle);
HttpConnection.getInstance().setHandler(mHandlerTilt);
mImageBubble = (ImageView) findViewById(R.id.imageViewBubble);
mImageDevice = (ImageView) findViewById(R.id.imageViewTilt);
mTextViewTilt = (TextView) findViewById(R.id.textViewTiltangle);
// 设置初始角度值
setTilts(0, 0);
mDialogShowing = true;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (mDialogShowing) {
// TODO Auto-generated method stub
// 从设备获取角度值
HttpConnection.getInstance().Add(Defines.REQUEST_GET, Defines.INTERFACE_GET_TILT);
sleep(1000);
}
}
});
thread.start();
}
@Override
public void onBackPressed() {
mDialogShowing = false;
cancel();
}
// 设置角度值,显示气泡位置
private void setTilts(double x, double y) {
DecimalFormat df = new DecimalFormat("0.00");
mTextViewTilt.setText("x: " + df.format(-y) + "° y: " + df.format(-x) + "°");
x = x > 5 ? 5 : x;
x = x < -5 ? -5 : x;
y = y > 5 ? 5 : y;
y = y < -5 ? -5 : y;
final float scale = getContext().getResources().getDisplayMetrics().density;
ViewGroup.MarginLayoutParams paramTest = (ViewGroup.MarginLayoutParams) mImageBubble.getLayoutParams();
paramTest.setMargins((int) (mImageDevice.getLeft() + (x * 13 + 80) * scale + 0.5f),
(int) (mImageDevice.getTop() + (y * 13 + 80) * scale + 0.5f),
0, 0);
mImageBubble.setLayoutParams(paramTest);
mImageBubble.requestLayout();
}
private Handler mHandlerTilt = new Handler() {
public void handleMessage(Message msg) {
String strRecv = msg.getData().getString("Body");
switch (msg.what) {
case Defines.ERROR:
int statusCode = msg.getData().getInt("Status");
new AlertDialog.Builder(getContext()).setTitle(
getContext().getResources().getString(R.string.error)
+ "(Error code:" + String.valueOf(statusCode) + ")")
.setIcon(android.R.drawable.ic_dialog_info)
.setCancelable(false)
.setPositiveButton(getContext().getResources().getString(R.string.close), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 点击“确认”后的操作
Intent intent = new Intent(mContext, MainActivity.class);
//传递退出所有Activity的Tag对应的布尔值为true
intent.putExtra("exist", true);
//启动BaseActivity
mContext.startActivity(intent);
}
}).show();
break;
case Defines.INTERFACE_GET_TILT:
if(strRecv != null) {
String[] tilt = strRecv.split(",");
setTilts(Double.valueOf(tilt[0]), Double.valueOf(tilt[1]));
}
break;
default:
break;
}
super.handleMessage(msg);
}
};
}
说明
- 布局使用RelativeLayout,便于计算和调整气泡位置;
- textViewLine是一条分割线,分开图片和文字;
- setTilts(double x, double y)根据传入的角度值设置文字和改变图片位置;
- 效果图片后面再添加;