2014-10-05 7 views
0

Я новичок в разработке Android, а также на языке программирования Java и определенно получаю некоторую помощь в этой проблеме.Android OnDraw и onTouchEvent не работают вместе

В настоящее время у меня есть код, который создает холст и рисует растровое изображение на нем, похоже, это работает. У меня также есть еще один бит кода, который определяет, где находится палец пользователя на экране устройств, и это также работает. когда я пытаюсь объединить два растрового изображения, будет отображаться, но как только я нажимаю на экран, приложение падает.

У меня такое ощущение, что эта проблема связана с этим видом холста/растровой карты, так как я также заметил, что любые виджеты, добавленные в макет, исчезают при запуске функции canvas/bitmap.

Это код холст/битовой карты:

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

}

+0

Опубликовать полную трассировку стека из ловушки. – Karakuri

ответ

0

В вашей иерархии просмотров нет EditText с идентификатором editText1. Это потому, что вы установили вид контента, чтобы быть один экземпляр вашего класса MyView (имена классов должны начинаться с прописными буквами), с этим кодом в onCreate():

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

В результате, вы получите NullPointerException на линии txt.setText("X = "+ x +" Y = " + y);, потому что предыдущая строка не может найти EditText.

Вам необходимо включить оба вида в макет. Вы можете использовать MyView в XML, написав его полное имя. Например:

<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> 
Смежные вопросы