您的位置:首页 > 博客中心 > APP开发 >

用ESP8266+android,制作自己的WIFI小车(Android 软件)

时间:2022-03-13 20:04

先说一下这篇文章里面的内容:TCP 客户端, 自定义对话框, 自定义按钮, ProgressBar竖直显示, 重力感应传感器,手机返回键新开启界面的问题(返回上次的界面),数据保存

软件的通信是配合

       

软件的第一个界面就一个按钮         点击按钮弹出一个自定义的对话框         连接的时候                              连接上

技术分享    技术分享  技术分享    技术分享

其实一开始想多加一些功能,,不过后来想了想复杂了反而不利于学习.........我会从一开始做到结束都写清楚,如果有大神看到哪地方不合理请指教哈,,,,,

好现在开始做APP

技术分享

技术分享

一路Next就行...

技术分享

 

 您会发现自己的按钮是圆边的

技术分享

其实是自己自定义了一些参数

新建一个文件夹存储咱们自定义的一些东西

技术分享

 

 

技术分享

 

技术分享

技术分享

技术分享

技术分享

技术分享

对了为什么名字是drawable

其实是官方提供的,,

 技术分享

然后呢各个参数后面都有具体解释

技术分享

有些小伙伴一看....英文的............大哥下一个有道翻译或者别的翻译软件翻译一下...................

可以自己搜索自己想要的

技术分享

好像这些外形啦背景什么的都在

 技术分享

技术分享

技术分享

技术分享

授人予鱼,也要授人予渔;

首先定义一下外形

方形

技术分享

 

然后呢描一下边框,,,显得是一个按钮

技术分享

技术分享

 

其实可以官方解释

技术分享

然后定义一下按钮现在显示的颜色

技术分享

 

好现在让它的四个角变成圆角,,,对于我这个学机械的而言在solidworks里面应该叫做倒角,,,,有没有学机械的看到这篇文章哈...

记得曾经遇到一个人和我正好相反,,我是报的机械专业,自学的电气,,,,,,而另一个人是报的电气却喜欢机械........兴趣.........

技术分享

技术分享

技术分享

 

好啦

拖一个按钮过来,放到中心.....您也可以在布局文件里面自己写哈......我是怎样方便怎样弄,,我用的是相对布局

技术分享

技术分享

 

 技术分享

保存一下现在看效果

技术分享

好现在再定义一个按钮按下时的外表文件

技术分享

技术分享

技术分享

private OnTouchListener buttonconnect1Touch = new OnTouchListener() {
        
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction()==MotionEvent.ACTION_DOWN) {
                buttonconnect1.setBackgroundResource(R.drawable.buttondown);
            }
            if (event.getAction()==MotionEvent.ACTION_UP) {
                buttonconnect1.setBackgroundResource(R.drawable.butonup);
            }
            return false;
        }
    };

技术分享

package com.wificardemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;

public class MainActivity extends Activity {

    Button buttonconnect1;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮
        
        buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件
    }

    private OnTouchListener buttonconnect1Touch = new OnTouchListener() {
        
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction()==MotionEvent.ACTION_DOWN) {
                buttonconnect1.setBackgroundResource(R.drawable.buttondown);
            }
            if (event.getAction()==MotionEvent.ACTION_UP) {
                buttonconnect1.setBackgroundResource(R.drawable.butonup);
            }
            return false;
        }
    };
    
    
    
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

技术分享

现在编译一下运行到手机看一下

技术分享

 

 技术分享

我是直接用的自己的手机,,没有仿真,,现在我的电脑用仿真可是不得了......

平时的状态                          按下后

技术分享  技术分享

 

自己看着改改大小和显示

技术分享  技术分享

咱们现在要做的是

技术分享

其实这个是自己自定义的一个界面

对了设置一下主题风格...

技术分享

感觉这种风格挺好的

技术分享

技术分享

技术分享

图片可以在我源码里面找,也可以自己弄自己的

技术分享

技术分享

对了,,,,位置还有名字什么的自己看着修改哈

 技术分享技术分享

 

 技术分享

 技术分享

 

 整体界面呢,,,

 技术分享

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:background="@android:color/white"
        android:id="@+id/textView22"
        android:layout_width="wrap_content"
        android:layout_height="2dip"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/imageView21"
        android:layout_marginTop="15dp" />

    <TextView
        android:id="@+id/textView21"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         android:layout_marginTop="8dp"
        android:layout_marginLeft="19dp"
        android:layout_toRightOf="@+id/imageView21"
        android:text="连接"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@android:color/white" />

    <TextView
        android:id="@+id/textView23"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView22"
        android:layout_marginTop="23dp"
        android:text="IP地址:" />

    <EditText
        android:id="@+id/editText21"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView23"
        android:layout_alignBottom="@+id/textView23"
        android:layout_alignLeft="@+id/textView21"
        android:ems="10"
        android:text="192.168.4.1" />

    <ImageView
        android:id="@+id/imageView21"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="14dp"
        android:src="@drawable/image1" />

    <TextView
        android:id="@+id/textView24"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/editText22"
        android:layout_alignBottom="@+id/editText22"
        android:layout_alignParentLeft="true"
        android:text="端口号:" />

    <EditText
        android:id="@+id/editText22"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText21"
        android:layout_below="@+id/editText21"
        android:layout_marginTop="10dp"
        android:ems="10"
        android:text="8080" />

    <Button
        android:id="@+id/button21"
        android:layout_width="80dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/editText22"
        android:layout_marginRight="10dp"
        android:background="@drawable/butonup"
        android:text="连接" />

    <Button
        android:id="@+id/Button22"
        android:layout_width="80dp"
        android:layout_height="40dp"
        android:layout_alignBottom="@+id/button21"
        android:layout_alignTop="@+id/button21"
        android:layout_marginLeft="10dp"
        android:background="@drawable/butonup"
        android:text="取消" />

    <ProgressBar
        android:id="@+id/progressBar21"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/textView23"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

好了现在点击主界面的按钮把这个界面当做提示框显示出来

 技术分享

 

package com.wificardemo;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button buttonconnect1;
    AlertDialog AlertDialog21;//定义一个提示框
    View View1;//定义一个view用来获取咱们自定义的界面
    Button connectbutton21;//连接服务器
    Button cancelbutton22;//取消按钮
    ProgressBar progressBar21;//进度条
    EditText iPEditText;//IP地址
    EditText portEditText;//端口号
    TextView titleEditText;//"连接"
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme);//设置主题风格
        setContentView(R.layout.activity_main);
        
        buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮
        
        buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件
        
        /**对话框相关**/
        AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create(); 
        View1 = View.inflate(MainActivity.this, R.layout.dialog, null);
        AlertDialog21.setView(View1);//设置显示内容为自定义的界面
        connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮
        cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮
        progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条
        progressBar21.setVisibility(-1);//进度条不显示
        iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址
        portEditText = (EditText)View1.findViewById(R.id.editText22);//端口号
        titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"
    }
    
    /***
     * 主界面连接服务器按钮
     */
    private OnTouchListener buttonconnect1Touch = new OnTouchListener() {
        
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction()==MotionEvent.ACTION_DOWN) {
                buttonconnect1.setBackgroundResource(R.drawable.buttondown);
            }
            if (event.getAction()==MotionEvent.ACTION_UP) {
                buttonconnect1.setBackgroundResource(R.drawable.butonup);
            }
            return false;
        }
    };
    
    
    
}

现在呢就缺少显示了...

我们在主按钮的点击事件中调用显示函数

 技术分享

 

package com.wificardemo;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button buttonconnect1;
    AlertDialog AlertDialog21;//定义一个提示框
    View View1;//定义一个view用来获取咱们自定义的界面
    Button connectbutton21;//连接服务器
    Button cancelbutton22;//取消按钮
    ProgressBar progressBar21;//进度条
    EditText iPEditText;//IP地址
    EditText portEditText;//端口号
    TextView titleEditText;//"连接"
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme);//设置主题风格
        setContentView(R.layout.activity_main);
        
        buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮
        buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件
        buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件
        /**对话框相关**/
        AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create(); 
        View1 = View.inflate(MainActivity.this, R.layout.dialog, null);
        AlertDialog21.setView(View1);//设置显示内容为自定义的界面
        connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮
        cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮
        progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条
        progressBar21.setVisibility(-1);//进度条不显示
        iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址
        portEditText = (EditText)View1.findViewById(R.id.editText22);//端口号
        titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"
    }
    /***
     * 主按钮点击事件
     */
    private OnClickListener buttonconnect1Click = new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            AlertDialog21.show();
        }
    };
    
    /***
     * 主界面连接服务器按钮背景改变
     */
    private OnTouchListener buttonconnect1Touch = new OnTouchListener() {
        
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction()==MotionEvent.ACTION_DOWN) {
                buttonconnect1.setBackgroundResource(R.drawable.buttondown);
            }
            if (event.getAction()==MotionEvent.ACTION_UP) {
                buttonconnect1.setBackgroundResource(R.drawable.butonup);
            }
            return false;
        }
    };
    
    
    
}

 

 现在安装到手机上看一下---界面还可以

                                                           做这个简单的取消事件

 技术分享  技术分享

 

 技术分享

 

 连接按钮呢!!我先说一下思路,,,按下连接按钮是启动一个连接任务,然后呢还要启动一个倒计时器(3S),,,控制这个连接任务执行的时间,还要显示进度条,,如果3S内连接上了,,那么在连接的后面关掉进度条,结束这个连接任务,取消定时器,关闭对话框,然后进入控制界面,,如果3S内没有连接上,也关闭连接任务,关掉进度条,同时显示连接失败.

 技术分享

 

 现在的

 

package com.wificardemo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.renderscript.Mesh.Primitive;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button buttonconnect1;
    AlertDialog AlertDialog21;//定义一个提示框
    View View1;//定义一个view用来获取咱们自定义的界面
    Button connectbutton21;//连接服务器
    Button cancelbutton22;//取消按钮
    ProgressBar progressBar21;//进度条
    EditText iPEditText;//IP地址
    EditText portEditText;//端口号
    TextView titleEditText;//"连接"
    
    String Ipstring="";//记录IP地址
    int portint=0;//记录端口号
    boolean ConnectFlage=true;
    int ShowPointSum=0;//显示点的数量,连接中.....(后面的点)
    Socket socket = null;//定义socket
    InetAddress ipAddress;
    OutputStream outputStream=null;//定义输出流
    InputStream inputStream=null;//定义输入流
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme);//设置主题风格
        setContentView(R.layout.activity_main);
        
        buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮
        buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件
        buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件
        /**对话框相关**/
        AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create(); 
        View1 = View.inflate(MainActivity.this, R.layout.dialog, null);
        AlertDialog21.setView(View1);//设置显示内容为自定义的界面
        connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮
        cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮
        progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条
        progressBar21.setVisibility(-1);//进度条不显示
        iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址
        portEditText = (EditText)View1.findViewById(R.id.editText22);//端口号
        titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"
        
        cancelbutton22.setOnClickListener(cancelbutton22Click);//对话框取消事件
        connectbutton21.setOnClickListener(connectbutton21Click);//对话框连接按钮点击事件
    }
    
    /***
     * 对话框连接按钮点击事件
     */
    private OnClickListener connectbutton21Click = new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Ipstring = iPEditText.getText().toString().replace(" ", "");
            portint = Integer.valueOf(portEditText.getText().toString().replace(" ", ""));
            progressBar21.setVisibility(0);//显示进度条
            tcpClientCountDownTimer.cancel();
            tcpClientCountDownTimer.start();
            ConnectFlage = true;
            ShowPointSum = 0;
            ConnectSeverThread connectSeverThread = new ConnectSeverThread();
            connectSeverThread.start();
        }
    };
    
    
    /***
     * 
     * @author 连接服务器任务
     *
     */
    class ConnectSeverThread extends Thread
    {
        public void run()
        {
            while(ConnectFlage)
            {
                try 
                {
                    ipAddress = InetAddress.getByName(Ipstring);
                    socket = new Socket(ipAddress, portint);
                    ConnectFlage = false;
                    tcpClientCountDownTimer.cancel();
                    runOnUiThread(new Runnable()
                    {
                        public void run() 
                        {    
                            progressBar21.setVisibility(-1);//关闭滚动条
                            AlertDialog21.cancel();//关闭提示框
                        }                        
                    });
                    inputStream = socket.getInputStream();//获取输入流
                
                } 
                catch (IOException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    
                }
            }
        }
    }
    
    /***
     * 对话框取消按钮事件
     */
    private OnClickListener cancelbutton22Click = new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            ConnectFlage = false;//取消连接任务
            tcpClientCountDownTimer.cancel();//结束定时器
            progressBar21.setVisibility(-1);//关闭滚动条
            AlertDialog21.cancel();//关闭对话框
        }
    };
    
    /***
     * 延时3s的定时器
     */
    private CountDownTimer tcpClientCountDownTimer = new CountDownTimer(3000,200) {
        @Override
        public void onTick(long millisUntilFinished) {//每隔200ms进入
            if (ConnectFlage) 
            {    ShowPointSum ++;
                switch (ShowPointSum%9) 
                {   case 0:titleEditText.setText("连接中");break;
                    case 1:titleEditText.setText("连接中.");break;
                    case 2:titleEditText.setText("连接中..");break;
                    case 3:titleEditText.setText("连接中...");break;
                    case 4:titleEditText.setText("连接中....");break;
                    case 5:titleEditText.setText("连接中.....");break;
                    case 6:titleEditText.setText("连接中......");break;
                    case 7:titleEditText.setText("连接中.......");break;
                    case 8:titleEditText.setText("连接中........");break;
                    default:
                        break;
                }
            }
        }
        @Override
        public void onFinish() {//3s后进入(没有取消定时器的情况下)
            if (ConnectFlage) 
            {    ConnectFlage = false;
                progressBar21.setVisibility(-1);//关闭滚动条
                titleEditText.setText("连接服务器失败!!");
            }
            tcpClientCountDownTimer.cancel();
        }
    }; 
    
    
    /***
     * 主按钮点击事件
     */
    private OnClickListener buttonconnect1Click = new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            titleEditText.setText("连接");
            AlertDialog21.show();
        }
    };
    
    /***
     * 主界面连接服务器按钮背景改变
     */
    private OnTouchListener buttonconnect1Touch = new OnTouchListener() {
        
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction()==MotionEvent.ACTION_DOWN) {
                buttonconnect1.setBackgroundResource(R.drawable.buttondown);
            }
            if (event.getAction()==MotionEvent.ACTION_UP) {
                buttonconnect1.setBackgroundResource(R.drawable.butonup);
            }
            return false;
        }
    };
    
}

 

 

 技术分享

 

 技术分享

 

 技术分享

 

 技术分享

 

 技术分享

 现在加上权限然后连接WIFI模块测试一下哈

技术分享

 

 

 

<uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
     <uses-permission android:name="android.permission.VIBRATE" />

 

 连接模块的无线

技术分享

技术分享

 

 技术分享

技术分享

然后会发现

对话框消失了

技术分享

因为咱们自己设置的消失

 技术分享

现在让它连接后打开控制界面

技术分享

还是先把IP和端口号的信息做成能够保存的吧

 咱们就用  SharedPreferences

可以看一下这篇文章的介绍

技术分享

 

 

得到SharedPreferences对象

技术分享

然后

技术分享

技术分享

那么一开始运行就要检测是不是记录了,,如果记录了就取出来记录的数据然后显示在对应的文本框中

技术分享

整体的代码

package com.wificardemo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.preference.PreferenceManager;
import android.renderscript.Mesh.Primitive;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button buttonconnect1;
    AlertDialog AlertDialog21;//定义一个提示框
    View View1;//定义一个view用来获取咱们自定义的界面
    Button connectbutton21;//连接服务器
    Button cancelbutton22;//取消按钮
    ProgressBar progressBar21;//进度条
    EditText iPEditText;//IP地址
    EditText portEditText;//端口号
    TextView titleEditText;//"连接"
    
    String Ipstring="";//记录IP地址
    int portint=0;//记录端口号
    boolean ConnectFlage=true;
    int ShowPointSum=0;//显示点的数量,连接中.....(后面的点)
    Socket socket = null;//定义socket
    InetAddress ipAddress;
    OutputStream outputStream=null;//定义输出流
    InputStream inputStream=null;//定义输入流
    
    private SharedPreferences sharedPreferences;//存储数据
    private SharedPreferences.Editor editor;//存储数据
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme);//设置主题风格
        setContentView(R.layout.activity_main);
        
        buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮
        buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件
        buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件
        /**对话框相关**/
        AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create(); 
        View1 = View.inflate(MainActivity.this, R.layout.dialog, null);
        AlertDialog21.setView(View1);//设置显示内容为自定义的界面
        connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮
        cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮
        progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条
        progressBar21.setVisibility(-1);//进度条不显示
        iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址
        portEditText = (EditText)View1.findViewById(R.id.editText22);//端口号
        titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"
        
        cancelbutton22.setOnClickListener(cancelbutton22Click);//对话框取消事件
        connectbutton21.setOnClickListener(connectbutton21Click);//对话框连接按钮点击事件
        
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        
        boolean issave = sharedPreferences.getBoolean("save", false);//得到save文件存的值,得不到会返回false
        if (issave) 
        {
            String Ipstring = sharedPreferences.getString("Ipstring", "192.168.4.1");//取出ip,不存在返回192.168.4.1
            String portint = sharedPreferences.getString("portint", "8080");//取出端口号,不存在返回8080
            iPEditText.setText(Ipstring);
            portEditText.setText(portint);
        }
    }
    
    /***
     * 对话框连接按钮点击事件
     */
    private OnClickListener connectbutton21Click = new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Ipstring = iPEditText.getText().toString().replace(" ", "");
            portint = Integer.valueOf(portEditText.getText().toString().replace(" ", ""));
            progressBar21.setVisibility(0);//显示进度条
            tcpClientCountDownTimer.cancel();
            tcpClientCountDownTimer.start();
            ConnectFlage = true;
            ShowPointSum = 0;
            ConnectSeverThread connectSeverThread = new ConnectSeverThread();
            connectSeverThread.start();
            
            editor = sharedPreferences.edit();
            editor.putString("Ipstring", Ipstring);//记录ip
            editor.putString("portint", portEditText.getText().toString());//记录端口号
            editor.putBoolean("save", true);//写入记录标志
            editor.commit();
        }
    };
    
    
    /***
     * 
     * @author 连接服务器任务
     *
     */
    class ConnectSeverThread extends Thread
    {
        public void run()
        {
            while(ConnectFlage)
            {
                try 
                {
                    ipAddress = InetAddress.getByName(Ipstring);
                    socket = new Socket(ipAddress, portint);
                    ConnectFlage = false;
                    tcpClientCountDownTimer.cancel();
                    runOnUiThread(new Runnable()
                    {
                        public void run() 
                        {    
                            progressBar21.setVisibility(-1);//关闭滚动条
                            AlertDialog21.cancel();//关闭提示框
                        }                        
                    });
                    inputStream = socket.getInputStream();//获取输入流
                
                } 
                catch (IOException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    
                }
            }
        }
    }
    
    /***
     * 对话框取消按钮事件
     */
    private OnClickListener cancelbutton22Click = new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            ConnectFlage = false;//取消连接任务
            tcpClientCountDownTimer.cancel();//结束定时器
            progressBar21.setVisibility(-1);//关闭滚动条
            AlertDialog21.cancel();//关闭对话框
        }
    };
    
    /***
     * 延时3s的定时器
     */
    private CountDownTimer tcpClientCountDownTimer = new CountDownTimer(3000,200) {
        @Override
        public void onTick(long millisUntilFinished) {//每隔200ms进入
            if (ConnectFlage) 
            {    ShowPointSum ++;
                switch (ShowPointSum%9) 
                {   case 0:titleEditText.setText("连接中");break;
                    case 1:titleEditText.setText("连接中.");break;
                    case 2:titleEditText.setText("连接中..");break;
                    case 3:titleEditText.setText("连接中...");break;
                    case 4:titleEditText.setText("连接中....");break;
                    case 5:titleEditText.setText("连接中.....");break;
                    case 6:titleEditText.setText("连接中......");break;
                    case 7:titleEditText.setText("连接中.......");break;
                    case 8:titleEditText.setText("连接中........");break;
                    default:
                        break;
                }
            }
        }
        @Override
        public void onFinish() {//3s后进入(没有取消定时器的情况下)
            if (ConnectFlage) 
            {    ConnectFlage = false;
                progressBar21.setVisibility(-1);//关闭滚动条
                titleEditText.setText("连接服务器失败!!");
            }
            tcpClientCountDownTimer.cancel();
        }
    }; 
    
    
    /***
     * 主按钮点击事件
     */
    private OnClickListener buttonconnect1Click = new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            titleEditText.setText("连接");
            AlertDialog21.show();
        }
    };
    
    /***
     * 主界面连接服务器按钮背景改变
     */
    private OnTouchListener buttonconnect1Touch = new OnTouchListener() {
        
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction()==MotionEvent.ACTION_DOWN) {
                buttonconnect1.setBackgroundResource(R.drawable.buttondown);
            }
            if (event.getAction()==MotionEvent.ACTION_UP) {
                buttonconnect1.setBackgroundResource(R.drawable.butonup);
            }
            return false;
        }
    };
    
}

现在做控制界面

 技术分享

技术分享

技术分享

技术分享

 

 

 技术分享

技术分享

 

 技术分享

技术分享

技术分享

 

 技术分享

技术分享

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:background="@android:color/background_dark"
        android:id="@+id/textView31"
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />
    
    <ImageButton
        android:background="@android:color/transparent"
        android:layout_marginBottom="20dp"
        android:id="@+id/imageButton31"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView31"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="35dp"
        android:src="@drawable/qianjin" />
    
    <ImageButton
        android:background="@android:color/transparent"
        android:layout_marginTop="20dp"
        android:id="@+id/imageButton32"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageButton31"
        android:layout_below="@+id/textView31"
        android:src="@drawable/houtui" />
    
    <ImageButton
        android:background="@android:color/transparent"
        android:id="@+id/imageButton33"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="10dp"
        android:src="@drawable/youzhuan" />
    
    <ImageButton
        android:background="@android:color/transparent"
        android:id="@+id/imageButton34"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginRight="30dp"
        android:layout_toLeftOf="@+id/imageButton33"
        android:src="@drawable/zuozhuan" />
    
    <CheckBox
        android:id="@+id/checkBox31"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="开重感" />

</RelativeLayout>

技术分享

这个ProgressBar默认是,,水平的

技术分享

要改成竖直的其实就是自己写一个外观和变化的文件,然后调用,,,,,就像咱们自定义按钮样式一样

 技术分享

技术分享

技术分享

然后呢在里面加上

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"
            />
        </shape>
    </item>
    
    <item android:id="@android:id/progress">
        <clip
                android:clipOrientation="vertical"  
                android:gravity = "bottom"
            >
               
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerX="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="90"
                />
            </shape>
        </clip>
    </item>

</layer-list>

要问我你怎么知道这样写..百度的,然后从源码里面copy 过来的.........亲们也可以百度哈,,,,,现在我也只是个入门的,只不过善于去用别人的东西,,不过后期我肯定会去学习这些东西代表的含义

 技术分享

技术分享

现在的控制的界面

技术分享

布局文件

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:background="@android:color/transparent"
        android:id="@+id/textView31"
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />
    
    <ImageButton
        android:background="@android:color/transparent"
        android:layout_marginBottom="20dp"
        android:id="@+id/imageButton31"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView31"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="35dp"
        android:src="@drawable/qianjin" />
    
    <ImageButton
        android:background="@android:color/transparent"
        android:layout_marginTop="20dp"
        android:id="@+id/imageButton32"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageButton31"
        android:layout_below="@+id/textView31"
        android:src="@drawable/houtui" />
    
    <ImageButton
        android:background="@android:color/transparent"
        android:id="@+id/imageButton33"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="10dp"
        android:src="@drawable/youzhuan" />
    
    <ImageButton
        android:background="@android:color/transparent"
        android:id="@+id/imageButton34"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginRight="30dp"
        android:layout_toLeftOf="@+id/imageButton33"
        android:src="@drawable/zuozhuan" />
    
    <CheckBox
        android:id="@+id/checkBox31"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="开重感" />

    <TextView
        android:id="@+id/textView32"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="速度" />

    <ProgressBar
        android:id="@+id/progressBar31"
        />

    <TextView
        android:id="@+id/textView33"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/progressBar31"
        android:layout_toRightOf="@+id/progressBar31"
        android:text="高" />

    <TextView
        android:id="@+id/textView34"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/checkBox31"
        android:layout_alignLeft="@+id/textView33"
        android:text="低" />

    <TextView
        android:id="@+id/textView35"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView33"
        android:layout_marginTop="20dp"
        android:layout_toRightOf="@+id/progressBar31"
        android:text="50" />

</RelativeLayout>

 

 

 

现在连接上以后跳转到这个界面

技术分享

设置在连接上以后,跳转

技术分享

 

 对了要在

技术分享

 

技术分享

 现在可以试一试

 技术分享

 技术分享

 技术分享

 

 整体还好啦.....只不过中间的那个textview太明显了.....咱在代码中把他设置成透明的

 技术分享

 

 技术分享

下面开始做控制的代码,那些一看就懂的咱就稍微一说哈,,,

现在看重力传感器,,还是先看,这个,,因为重力传感器的数据要用这个ProgressBar显示

技术分享

 

 技术分享

可以下载进去看一下

技术分享

 先把这个也做上

 技术分享

技术分享

现在把手机的传感器弄上来

技术分享

技术分享

 

技术分享

技术分享

 

 

 技术分享

 

 这是一个人介绍的感觉挺好的

现在的程序

package com.wificardemo;



import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ProgressBar;

public class Control extends MainActivity {
    
    ProgressBar progressBar31;//进度条
    CheckBox  checkBox31;//打开重力传感器
    
    SensorManager sensorManager;//新建sensor的管理器
    Sensor sensor;//传感器
    float X_lateral;//X方向角度
    int Speed=0;//速度
    TextView textView35;//显示速度值
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme);//设置主题风格
        setContentView(R.layout.control);
        
        progressBar31 = (ProgressBar) findViewById(R.id.progressBar31);
        progressBar31.setProgress(50);//显示到一半
        
        checkBox31 = (CheckBox) findViewById(R.id.checkBox31);
        checkBox31.setOnCheckedChangeListener(checkBox31Check);
        
        textView35 = (TextView) findViewById(R.id.textView35);//速度显示
    }
    
    /***
     * 单选框事件
     */
    private OnCheckedChangeListener checkBox31Check = new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if (isChecked) 
            {
                sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//获取手机里面的传感器  
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//选择获取重力传感器
                                              //监听函数                        重力传感器对象              工作频率
                sensorManager.registerListener(mySensorEventListener, sensor,  SensorManager.SENSOR_DELAY_NORMAL);// SENSOR_DELAY_GAME  
            }
            else 
            {
                sensorManager.unregisterListener(mySensorEventListener);//释放传感器
            }
        }
    };
    
    /**
     * 重力传感器监听事件
     */
    SensorEventListener mySensorEventListener = new SensorEventListener() {
        
        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
            { 
                X_lateral = event.values[0]+10; //把-10到10的数据变为0-20  
                Speed = (int)((100-(X_lateral*10/2))*2);//变为0-200
                if (Speed>100) {
                    Speed = 100;
                }
                textView35.setText(String.valueOf(Speed));
                //Toast.makeText(controlcar.this, Y_longitudinal+"", 500).show();
                runOnUiThread(new Runnable() {
                    public void run() 
                    {
                        progressBar31.setProgress(Speed);
                    }
                });
            }  
        }
        
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub
            
        }
    };
}

直接加了一些程序下载到手机旋转手机可以看出效果

 技术分享

技术分享

 

 

技术分享

 对了,,一定要加一个关掉传感器的操作.....因为一旦打开,,您不主动关掉,它就一直运行,,,,,,耗电哈,,耗电,,耗电,,,,

技术分享

protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(mySensorEventListener);
    }
package com.wificardemo;



import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ProgressBar;
import android.widget.Toast;

public class Control extends MainActivity {
    
    ProgressBar progressBar31;//进度条
    CheckBox  checkBox31;//打开重力传感器
    
    SensorManager sensorManager;//新建sensor的管理器
    Sensor sensor;//传感器
    float X_lateral;//X方向角度
    int Speed=0;//速度
    TextView textView35;//显示速度值
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme);//设置主题风格
        setContentView(R.layout.control);
        
        progressBar31 = (ProgressBar) findViewById(R.id.progressBar31);
        progressBar31.setProgress(50);//显示到一半
        
        checkBox31 = (CheckBox) findViewById(R.id.checkBox31);
        checkBox31.setOnCheckedChangeListener(checkBox31Check);
        
        textView35 = (TextView) findViewById(R.id.textView35);//速度显示
    }
    
    /***
     * 单选框事件
     */
    private OnCheckedChangeListener checkBox31Check = new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if (isChecked) 
            {
                sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//获取手机里面的传感器  
                sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//选择获取重力传感器
                                              //监听函数                        重力传感器对象              工作频率
                sensorManager.registerListener(mySensorEventListener, sensor,  SensorManager.SENSOR_DELAY_NORMAL);// SENSOR_DELAY_GAME  
            }
            else 
            {
                sensorManager.unregisterListener(mySensorEventListener);//释放传感器
            }
        }
    };
    
    /**
     * 重力传感器监听事件
     */
    SensorEventListener mySensorEventListener = new SensorEventListener() {
        
        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
            {  
                X_lateral = event.values[0]+10; //把-10到10的数据变为0-20  
                Speed = (int)((100-(X_lateral*10/2))*2);//变为0-200
                if (Speed>100) {
                    Speed = 100;
                }
                textView35.setText(String.valueOf(Speed));
                //Toast.makeText(controlcar.this, Y_longitudinal+"", 500).show();
                runOnUiThread(new Runnable() {
                    public void run() 
                    {
                        progressBar31.setProgress(Speed);
                    }
                });
            } 
            else
            {
                sensorManager.unregisterListener(mySensorEventListener);
                runOnUiThread(new Runnable() {
                    public void run() 
                    {
                        checkBox31.setChecked(false);
                        Toast.makeText(Control.this, "传感器不存在!!!", 500).show();
                    }
                });
            }
        }
        
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub
            
        }
    };
    
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(mySensorEventListener);
    }
    
}

 

 现在把按键的事件做上,,,按下咱做成震动一下,,当然也可以自己做成播放声音的

package com.wificardemo;


import android.app.Service;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ProgressBar;
import android.widget.Toast;

public class Control extends MainActivity {
    
    ProgressBar progressBar31;//进度条
    CheckBox  checkBox31;//打开重力传感器
    SensorManager sensorManager;//新建sensor的管理器
    Sensor sensor;//传感器
    float X_lateral;//X方向角度
    int Speed=0;//速度
    TextView textView35;//显示速度值
    
    ImageButton imageButton31;//前进
    ImageButton imageButton32;//后退
    ImageButton imageButton33;//右转
    ImageButton imageButton34;//左转
    
    boolean forward = false;
    boolean back = false;
    boolean right = false;
    boolean left = false;
    
    Vibrator vibrator;//按钮按下震动
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme);//设置主题风格
        setContentView(R.layout.control);
        
        progressBar31 = (ProgressBar) findViewById(R.id.progressBar31);
        progressBar31.setProgress(50);//显示到一半
        
        checkBox31 = (CheckBox) findViewById(R.id.checkBox31);
        checkBox31.setOnCheckedChangeListener(checkBox31Check);
        
        textView35 = (TextView) findViewById(R.id.textView35);//速度显示
        
        imageButton31 = (ImageButton) findViewById(R.id.imageButton31);//前进
        imageButton32 = (ImageButton) findViewById(R.id.imageButton32);//后退
        imageButton33 = (ImageButton) findViewById(R.id.imageButton33);//右转
        imageButton34 = (ImageButton) findViewById(R.id.imageButton34);//左转
        
        imageButton31.setOnTouchListener(imageButton31Touch);//前进
        imageButton32.setOnTouchListener(imageButton32Touch);//后退
        imageButton33.setOnTouchListener(imageButton33Touch);//右转
        imageButton34.setOnTouchListener(imageButton34Touch);//左转
        
        vibrator=(Vibrator)getSystemService(Service.VIBRATOR_SERVICE);//震动
    }
    
    /***
     * 前进按钮
     */
    private OnTouchListener imageButton31Touch = new OnTouchListener() {
        
        @Override
                                

相关推荐

电脑软件

本类排行

今日推荐

热门手游