java - Android OnDraw 和 onTouchEvent 不能一起工作

标签 java android touch-event ondraw

我是 Android 开发和 Java 编程语言的新手,非常感谢您在这个问题上提供一些帮助。

目前我有一些代码可以创建 Canvas 并在其上绘制位图图片,这似乎有效。我还有另一段代码可以检测用户手指在设备屏幕上的位置,这也可以工作。当我尝试将两者组合时,位图将显示,但一旦我单击屏幕,应用程序就会崩溃。

我有一种感觉,这个问题与 Canvas /位图方面有关,因为我还注意到,当 Canvas /位图功能运行时,添加到布局中的任何小部件都会消失。

这是 Canvas /位图的代码:

public class myView extends View{

Bitmap image;
DisplayMetrics metrics;
public myView(Context context) {
    super(context);
    metrics = context.getResources().getDisplayMetrics();
    // TODO Auto-generated constructor stub
    image = BitmapFactory.decodeResource(getResources(), R.drawable.bhead);

}
@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);

    int width = metrics.widthPixels;
    int height = metrics.heightPixels;

    Matrix matrix = new Matrix();
    float angle = 90;
    float imageCenterX = 50;
    float imageCenterY = 50;
    matrix.setRotate(angle, imageCenterX, imageCenterY);
    Bitmap temp;
    temp = BitmapFactory.decodeResource(getResources(), R.drawable.bhead);
    image = Bitmap.createScaledBitmap(temp, 100, 100,true);
    matrix.postTranslate(((width/2)-50), ((height/2)-100));
    canvas.drawBitmap(image, matrix, null);

}

}

这是屏幕上手指位置的代码:

public class MainActivity extends ActionBarActivity {

myView mview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mview = new myView(this);
    setContentView(mview);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int x = (int)event.getX();
    int y = (int)event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
    }

    EditText txt = (EditText)findViewById(R.id.editText1);
    txt.setText("X = "+ x +" Y = " + y);

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

}

最佳答案

您的 View 层次结构中没有 ID 为 editText1 的 EditText。这是因为您已将内容 View 设置为类 MyView 的单个实例(类名称应以大写字母开头),并在 onCreate() 中使用以下代码:

mview = new myView(this);
setContentView(mview);

因此,您会在 txt.setText("X = "+ x +"Y = "+ y); 行上收到 NullPointerException,因为上一行找不到 EditText。

您需要在布局中包含这两个 View 。您可以通过编写其完全限定名称来在 XML 中使用 MyView。例如:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.your.package.name.MyView
        android:id="@+id/my_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ... />
</LinearLayout>

关于java - Android OnDraw 和 onTouchEvent 不能一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26203460/

相关文章:

java - 使用 ArrayList 作为类中的静态属性?

android - 不保留当前状态的子菜单项

Android - OnTouchListener 不工作

java - 我可以在没有 root 的情况下使用辅助功能 API 在我自己的应用程序之外触发触摸事件吗?

java - 使用外部库通过 ANT 进行编译

java - 扩展@Named @SessionScoped bean

java - 如何在 ShrinkWrap 容器中使用 log4j2?

java - 应该以静态方式访问静态字段 Context.ALARM_SERVICE

Android AdMob SDK 异常行为

java - 如何在 Linux 上将 JavaFX 多点触控事件与 JFX Pane 组件一起使用