从零开发一个完整的Android项目(八)——水平气泡显示

水平气泡显示

水平气泡用于显示设备水平倾角值,便于查看设备是否歪斜和整平。

布局

<?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)根据传入的角度值设置文字和改变图片位置;
  • 效果图片后面再添加;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值