android 空调遥控器——遥控器基本版(功能全部实现)

小编接着上一篇博客接着说咱们的空调遥控器,上一篇讲了基本的发送一个指令,这次小编给大家带来了,android基于红外的空调遥控器的完整版,基本实现了对格力空调的完全控制,(源代码已经,在我的资源处给出了大家可以点击链接下载http://download.csdn.net/detail/gywuhengy/9865590)不说了 上图:
这是第一张 关闭状态:
这里写图片描述

第二张:开机
这里写图片描述

第三张:简单的切换模式 调整温度:
这里写图片描述

2.原理 ,实现已经在代码里面说的很清楚了,大家自己看一下吧(主要贴出功能代码,布局自己在源码里面看吧)

空调遥控器 主fragment

package com.gaoyu.smarttools.fragment;

import android.content.Context;
import android.graphics.Typeface;
import android.hardware.ConsumerIrManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.gaoyu.smarttools.R;
import com.gaoyu.smarttools.bean.AirBean;
import com.gaoyu.smarttools.date.CodeCommand;

import static android.content.Context.CONSUMER_IR_SERVICE;

/**
 * Created by ${高宇} on 17/6/5.
 */
//需要api大于19与下面if判断用途类似
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public class AirConditionerFragment extends Basefragment implements View.OnClickListener {
    //获取红外控制类
    private ConsumerIrManager IR;
    //判断是否有红外功能
    boolean IRBack;

    private View view;
    private TextView tempShow, airWindDir, windDirAuto, windSpeed, modeShow;
    private ImageView modeCold, modeWatted, modeAuto, modeSupply, modeHeating;
    //开关、度数、模式、自动手动、风向、风量
    private AirBean airBean = new AirBean(0, 25, 0, 0, 0, 0);


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_air, container, false);
        inItEvent();
        inItUI();
        return view;
    }


    //初始化事务
    private void inItEvent() {
        //获取ConsumerIrManager实例
        IR = (ConsumerIrManager)getActivity().getSystemService(CONSUMER_IR_SERVICE);

        //如果sdk版本大于4.4才进行是否有红外的功能(手机的android版本)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            IRBack = IR.hasIrEmitter();
            if (!IRBack) {
                showToast("对不起,该设备上没有红外功能!");
            } else {
                showToast("红外设备就绪");//可进行下一步操作
            }
        }
    }

    //初始化UI
    private void inItUI() {

        //按钮设置

        DisplayMetrics dm = getResources().getDisplayMetrics();
        int screenWidth = dm.widthPixels / 4;
        int screenHeight = dm.heightPixels / 10;
        Log.e("gaoyu", "宽高" + screenWidth + screenHeight);

        Button air_power = (Button) view.findViewById(R.id.btn_air_power);
        air_power.setOnClickListener(this);
        air_power.setWidth(screenWidth);
        air_power.setHeight(screenHeight);

        Button air_mode = (Button) view.findViewById(R.id.btn_air_mode);
        air_mode.setOnClickListener(this);
        air_mode.setWidth(screenWidth);
        air_mode.setHeight(screenHeight);


        Button air_tempadd = (Button) view.findViewById(R.id.btn_air_up);
        air_tempadd.setOnClickListener(this);
        air_tempadd.setWidth(screenWidth);
        air_tempadd.setHeight(screenHeight);

        Button air_tempsub = (Button) view.findViewById(R.id.btn_air_down);
        air_tempsub.setOnClickListener(this);
        air_tempsub.setWidth(screenWidth);
        air_tempsub.setHeight(screenHeight);

        Button air_wind_auto_dir = (Button) view.findViewById(R.id.btn_air_auto);
        air_wind_auto_dir.setOnClickListener(this);
        air_wind_auto_dir.setWidth(screenWidth);
        air_wind_auto_dir.setHeight(screenHeight);

        Button air_wind_count = (Button) view.findViewById(R.id.btn_air_count);
        air_wind_count.setOnClickListener(this);
        air_wind_count.setWidth(screenWidth);
        air_wind_count.setHeight(screenHeight);

        Button air_wind_dir = (Button) view.findViewById(R.id.btn_air_direction);
        air_wind_dir.setOnClickListener(this);
        air_wind_dir.setWidth(screenWidth);
        air_wind_dir.setHeight(screenHeight);

        //显示设置
        Context context = getContext();
        Typeface type = Typeface.createFromAsset(context.getAssets(), "fonts/lcd.TTF");
        tempShow = (TextView) view.findViewById(R.id.temp_show);
        tempShow.setTypeface(type);

        modeShow = (TextView) view.findViewById(R.id.text_mode);
        windSpeed = ((TextView) view.findViewById(R.id.text_wind_speed));
        airWindDir = ((TextView) view.findViewById(R.id.wind_dir));
        windDirAuto = ((TextView) view.findViewById(R.id.wind_dir_auto));

        modeCold = (ImageView) view.findViewById(R.id.image_cold);
        modeWatted = (ImageView) view.findViewById(R.id.image_watted);
        modeAuto = (ImageView) view.findViewById(R.id.image_auto);
        modeSupply = (ImageView) view.findViewById(R.id.image_supply);
        modeHeating = (ImageView) view.findViewById(R.id.image_heating);

    }

    /**
     * 点击处理
     *
     * @param v
     */
    @Override
    public void onClick(View v) {
        //五中模式
        int data;
        //关机状态
        if(IRBack == false){
            showToast("无红外设备!");
            return;
        }
        if (airBean.getmPower() == 0x00 && v.getId() != R.id.btn_air_power) {
            return;
        }

        switch (v.getId()) {

            case R.id.btn_air_mode:
                data = airBean.getmMode();
                data++;
                if (data > 4) {
                    data = 0;
                }
                airBean.setmMode(data);
                SendMsg(airBean);
                break;
            case R.id.btn_air_power:

                if (airBean.getmPower() == 0) {
                    airBean.setmPower(1);
                } else {
                    airBean.setmPower(0);
                }
                //发送消息
                SendMsg(airBean);
                break;
            case R.id.btn_air_up:
                data = airBean.getmTmp();
                data++;
                if (data > 30) {
                    data = 16
Android中,遥控器事件的分发机制与触屏事件的分发机制有所不同。遥控器事件是通过按键点击事件来触发的,而触屏事件是通过触摸屏幕来触发的。 遥控器事件的分发流程如下: 1. 当用户在遥控器上按下一个按键时,该按键的点击事件会从顶层的DecorView开始分发。 2. 事件会依次传递给DecorView的子View,直到找到一个能够处理该事件的View。 3. 一旦找到了能够处理事件的View,事件将被传递给该View的onKeyDown/Up()、onKey()或onClick()等方法进行处理。 与触屏事件不同的是,在触屏事件中,我们可以通过重写onInterceptTouchEvent()方法返回true来停止事件的分发并自己处理事件。但在遥控器事件中,并没有类似的方法可以拦截事件的分发。因此,如果我们想要在Activity中拦截遥控器事件并自己处理,我们需要重写onKeyDown/Up()等方法来处理事件。 总结起来,遥控器事件的分发机制与触屏事件的分发机制有所不同。遥控器事件通过按键点击事件触发,从顶层的DecorView开始分发给具体的子View进行处理。如果我们想要在Activity中拦截遥控器事件并自己处理,我们需要重写onKeyDown/Up()等方法来处理事件。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [Android——按键事件KeyEvent的分发处理流程解析](https://blog.csdn.net/u012230055/article/details/103824930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值