啥都-不会 2016-05-27 02:45 采纳率: 16.7%
浏览 1420
已采纳

Android 应用触摸拖动时崩溃

package com.example.test1;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout.LayoutParams;
import android.widget.Toast;

public class MainActivity extends Activity {
Button button_1;
private Circle circle;
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,1000);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_1 = (Button) findViewById(R.id.button_1);

    button_1.setOnClickListener( new OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            final String[] items = {"圆","2","3","4","5","6","7","8","9","0"};
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("选择序号");
            builder.setItems(items,new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int index) {
                    // TODO Auto-generated method stub
                    switch(index){
                        case 0:
                            circle = new Circle(getApplicationContext());
                            Toast.makeText(MainActivity.this,"圆",Toast.LENGTH_LONG).show();
                            addContentView(circle,params);
                            break;
                        case 1:
                            Toast.makeText(MainActivity.this,"click 2", Toast.LENGTH_LONG).show();
                            break;
                        case 2:
                            Toast.makeText(MainActivity.this,"click 3",Toast.LENGTH_LONG).show();
                            break;
                        case 3:
                            Toast.makeText(MainActivity.this,"click 4",Toast.LENGTH_LONG).show();
                            break;
                        case 4:
                            Toast.makeText(MainActivity.this,"click 5",Toast.LENGTH_LONG).show();
                            break;
                        case 5:
                            Toast.makeText(MainActivity.this,"click 6",Toast.LENGTH_LONG).show();
                            break;
                        case 6:
                            Toast.makeText(MainActivity.this,"click 7",Toast.LENGTH_LONG).show();
                            break;
                        case 7:
                            Toast.makeText(MainActivity.this,"click 8",Toast.LENGTH_LONG).show();
                            break;
                        case 8:
                            Toast.makeText(MainActivity.this,"click 9",Toast.LENGTH_LONG).show();
                            break;
                        case 9:
                            Toast.makeText(MainActivity.this,"click 0",Toast.LENGTH_LONG).show();
                            break;
                    }
                }
            });
            builder.create().show(); 
        }

    });

}

@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);
}

}

package com.example.test1;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Paint.Style;
import android.view.View;

public class MyLayout extends View {

public Point uppoint,downpoint,movepoint;
public Paint paint;
public Canvas canvas;
public Bitmap bitmap;
public int flag;
public MyLayout(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    paint = new Paint(Paint.DITHER_FLAG);
    bitmap = Bitmap.createBitmap(1000,2000,Bitmap.Config.ARGB_8888);
    canvas = new Canvas(bitmap);
    paint.setStyle(Style.STROKE);//非填充
    paint.setStrokeWidth(4);
    paint.setColor(Color.BLACK);
    paint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    canvas.drawBitmap(bitmap,0,0,null);
}

}

package com.example.test1;

import android.content.Context;
import android.graphics.*;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;

public class Circle extends MyLayout {
public Point rpoint;
public int radius;
public double distance;
public Circle(Context context) {
super(context);
// TODO Auto-generated constructor stub
rpoint = new Point();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
downpoint.set((int)event.getX(),(int)event.getY());
if(radius!=0){
distance = Math.sqrt((downpoint.x - rpoint.x)*(downpoint.x - rpoint.x)+(downpoint.y - rpoint.y)*(downpoint.y - rpoint.y));
// Toast.makeText(Circle.this,"distance",Toast.LENGTH_LONG).show();
Log.i("distance::::::::::::::::::::::",String.valueOf(distance));
if(distance >= radius - 20 ||distance <= radius + 20){
Log.e("circle::::","error");
flag = 1;//yuanshang
}
if(distance < radius){
Log.e("circle::::","2e2r2r2o2r2");
//yuannei
flag = -1;
}
if(distance > radius){
Log.e("circle::::","3e3r3r3o3r3");
//yuanwai
flag = 0;
}
else{
Log.e("circle::::","4e4r4r4o4r4");
flag = 0;
}
}
break;
case MotionEvent.ACTION_MOVE:
movepoint.set((int)event.getX(),(int)event.getY());
switch(flag){
case 1:
Log.i("circle::::-------","1");
radius = (int)Math.sqrt((movepoint.x - rpoint.x)*(movepoint.x - rpoint.x)+(movepoint.y - rpoint.y)*(movepoint.y - rpoint.y));
break;
case -1:
Log.i("circle::::-------","2");
rpoint.x = movepoint.x;
rpoint.y = movepoint.y;
break;
default:
Log.i("circle::::-------","3");
rpoint.set(downpoint.x, downpoint.y);
radius = (int)Math.sqrt((movepoint.x - rpoint.x)*(movepoint.x - rpoint.x)+(movepoint.y - rpoint.y)*(movepoint.y - rpoint.y));
break;
}
}
return true;
}

}

 各位大神,我这个东西发布上去选定圆,然后触摸拖动的时候就崩溃了,求大神帮忙看看
  • 写回答

4条回答 默认 最新

  • lbcab 2016-05-27 05:22
    关注

    distance = Math.sqrt((downpoint.x - rpoint.x)*(downpoint.x - rpoint.x)+(downpoint.y - rpoint.y)*(downpoint.y - rpoint.y));
    问题出在这一句, 因为你的rpoint只是在circle的构造中new出来, 但没有初始化, 这时候rpoint为null, 你在去点击屏幕, 进入DOWN事件, 程序
    运行到上面一句时, 去计算两点间距离使用rpoint的值出现问题, 因为此时rpoint为null. 报出空指针异常的问题. 解决方法就是给rpoint赋一个初始值.

    ps: 用不着log贴两遍

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求
  • ¥20 antv g6 折线边如何变为钝角
  • ¥30 如何在Matlab或Python中 设置饼图的高度
  • ¥15 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao
  • ¥20 Vite 打包的 Vue3 组件库,图标无法显示
  • ¥15 php 同步电商平台多个店铺增量订单和订单状态
  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别