setOnTouchListener不适用于相对布局"避免在绘制/布局操作期间分配对象(预分配和重用)"

时间:2013-12-19 16:01:14

标签: java android android-layout

此软件的目标是在您拨打圆圈时显示一个数字。  djfsgfnbld vkjbndfjncvkjf vjfnbjnvcdjbsdn jwfnbxckcx 我有这个错误 BN,lmùlkjhgfghklmùmlkjhgfghjklmlkjhgfdfghjklm ghjklbvcfghjklm ;, bvc ghjkkjhgfghjklkjhgfghjkllkjhgfghjkvcghjkl fghvcfghj     在绘制/布局操作期间避免对象分配(预分配和重用) 在这里:

bg=(RelativeLayout)findViewById(R.id.bg);
bg.setOnTouchListener(new View.OnTouchListener())

为什么?

screenshot

编辑:这是我的activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"


xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f000"
android:gravity="fill"
android:ignoreGravity="@drawable/btn3_small"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
android:id="@+id/txt9"
android:layout_width="160dp"
android:layout_height="160dp"
android:layout_centerInParent="true"
android:gravity="center"
android:text="9"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/txt1"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_above="@id/txt9"
android:layout_alignLeft="@id/txt9"
android:gravity="center"
android:paddingRight="12dp"
android:paddingTop="12dp"
android:text="1"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/txt8"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignTop="@id/txt1"
android:layout_toRightOf="@id/txt1"
android:gravity="center"
android:paddingLeft="12dp"
android:paddingTop="12dp"
android:text="8"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/txt2"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignTop="@id/txt9"
android:layout_toLeftOf="@id/txt9"
android:gravity="center"
android:paddingBottom="12dp"
android:paddingLeft="12dp"
android:text="2"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/txt3"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_below="@id/txt2"
android:layout_toLeftOf="@id/txt9"
android:gravity="center"
android:paddingLeft="12dp"
android:paddingTop="12dp"
android:text="3"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/txt4"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignLeft="@id/txt9"
android:layout_below="@id/txt9"
android:gravity="center"
android:paddingBottom="12dp"
android:paddingRight="12dp"
android:text="4"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/txt5"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignTop="@id/txt4"
android:layout_toRightOf="@id/txt4"
android:gravity="center"
android:paddingBottom="12dp"
android:paddingLeft="12dp"
android:text="5"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/txt7"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignTop="@id/txt9"
android:layout_toRightOf="@id/txt9"
android:gravity="center"
android:paddingBottom="12dp"
android:paddingRight="12dp"
android:text="7"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/txt6"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_below="@id/txt7"
android:layout_toRightOf="@id/txt9"
android:gravity="center"
android:paddingRight="12dp"
android:paddingTop="12dp"
android:text="6"
android:textColor="#ffff"
android:textSize="40sp"
android:textStyle="bold" />

<TextView
android:id="@+id/textView_BoutonId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="TextView" />

<TextView
android:id="@+id/textView_XetYduCurseur"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView_BoutonId"
android:text="TextView" />

<TextView
android:id="@+id/TextView_Rayon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView_XetYduCurseur"
android:text="TextView" />



<TextView


android:id="@+id/textView_AngleClique"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/TextView_Rayon"
android:text="T

extView" />

</RelativeLayout>






This is my mainactivity.java : 



/*
* Author : 
* date : 06/12/2013
* 
* dwfbdjb,dmlv  kjslfwbnklmd,wbflmd ksfbnknddno
*/

package com.example.ando_dessin_test;


import java.util.Random;

import com.example.angros_c_doudou.R;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity
extends Activity
{

final Paint pnt = new Paint(Paint.ANTI_ALIAS_FLAG);
final Random rnd = new Random();

RelativeLayout rlBG;

// debut1 variable pour affiché action sur clique
private TextView tView;
private TextView tView1;
private TextView tView2;
private TextView tView3;
private double rayon=0;
private double xCentre=0;
private double yCentre=0;
private RelativeLayout bg;
// fin1

@Override
protected final void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

// Make it fullscreen
// Desactiver la barre de titre de notre application
requestWindowFeature(Window.FEATURE_NO_TITLE);
// Passer la fenêtre en full-creen == cacher la barre de notification
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_main);

rlBG = (RelativeLayout) findViewById(R.id.bg);
rlBG.setPadding(0, 0, 0, 0);
final CustomView cv = new CustomView(this);

rlBG.addView(cv);
sendViewToBack(cv);
}

private static void sendViewToBack(final View v)
{
final ViewGroup parent = (ViewGroup)v.getParent();
if (parent != null)
{
parent.removeView(v);
parent.addView(v, 0);
}
}

private class CustomView extends View
{
public CustomView(final Context ctx)
{
super(ctx);
}

@Override
protected final void onDraw(final Canvas cnv)
{
//
super.onDraw(cnv);

// Clear the canvas
cnv.drawRGB(0, 0, 0);

// Instance de Paint pour définir l'attribut couleur de notre point,
// ainsi que sa taille.

// Nous allons dessiner nos points par rapport à la résolution de
// l'écran
final int width = cnv.getWidth(); // Largeur
final int height = cnv.getHeight(); // Hauteur
final float rayonDuCercle = (float) (cnv.getWidth() *.5) - 5;
final float rayonDuCerclePetit = (float) (cnv.getWidth() * .167);

// pour faire jolie , les etoiles dans le fond d'ecrand
// drawStars(cnv, width, height);

//
drawRays(cnv, rayonDuCercle, rayonDuCerclePetit);

//
drawCircles(cnv, width, height, rayonDuCercle, rayonDuCerclePetit);

//
//draw small circle
// drawCircles(cnv, width/4, height/4, rayonDuCercle/4, rayonDuCerclePetit/4);


//debut2 code pour 
tView = (TextView) findViewById(R.id.textView_XetYduCurseur);
tView.setText("0");
tView1 = (TextView) findViewById(R.id.TextView_Rayon);
tView1.setText("0");
tView2 = (TextView) findViewById(R.id.textView_AngleClique);
tView2.setText("0");
tView3 = (TextView) findViewById(R.id.textView_BoutonId);
tView3.setText("0");


bg=(RelativeLayout)findViewById(R.id.bg);

bg.setOnTouchListener( new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub

//-------avant--------Display display = getWindowManager().getDefaultDisplay();

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);



double widthScreen = bg.getWidth(); //480 getWindowManager().getDefaultDisplay().getWidth(); getApplicationContext().getResources().getDisplayMetrics().widthPixels; // metrics.widthPixels;
double heightScreen = bg.getHeight();//800 getWindowManager().getDefaultDisplay().getHeight(); getApplicationContext().getResources().getDisplayMetrics().heightPixels;//metrics.heightPixels;

//double widthScreen = display.getWidth();
//double heightScreen = display.getHeight();
double angle =0 ;
int bouton = 0;
//-----------avant-------------double widthScreen = display.getWidth();
//-----------avant-------------double heightScreen = display.getHeight();
/* sur ma console les coordonees par defaut sont 240*400*/


if (event.getAction() == MotionEvent.ACTION_DOWN){
/* le getX() fonctionne mal - chercher sur o,ter,et */
//xCentre=event.getX()+31-widthScreen/2;
//yCentre=(event.getY()+68-heightScreen/2)*-1;
xCentre=event.getX()-widthScreen/2;
yCentre=(event.getY()-heightScreen/2)*-1;

tView.setText(/*"angle"+Math.toDegrees(Math.tan(event.getX()/event.getX()))+*/"coordinates:" +
String.valueOf(xCentre) + "x" + String.valueOf(yCentre));
rayon=Math.sqrt(xCentre*xCentre+yCentre*yCentre);

//l'angle est va de 0 a 90 degree 
//le but est d'ajouter un angle pour que l'angle aille de 0 a 360

angle=Math.toDegrees(Math.atan(yCentre/xCentre));

angle += xCentre < 0 ? 180 : 0;
/*//
if(xCentre < 0){
angle += 180;
}else{
angle += 0;
}
//*/
angle += angle < 0 ? 360 : 0;





// Chaque bouton a un angle de 360/8 degree
if(angle<=110 && angle>65) bouton=1;
if(angle<=65 && angle>20) bouton=2;
if(angle<=20 || angle>335) bouton=3;
if(angle<=335 && angle>290) bouton=4;
if(angle<=290 && angle>255) bouton=5;
if(angle<=255 && angle>200) bouton=6;
if(angle<=200 && angle>165) bouton=7;
if(angle<=165 && angle>110) bouton=8;

//A 17% de la largeur du diametre on est dans le centre
if(rayon<(widthScreen*0.17)) bouton=9;
//Par logique si le rayon est plus grand que la largeur du menu(=diametre) on est en dehors
if(rayon>(widthScreen/2)) bouton=-1;





tView3.setText("Rayon : "+(int)rayon+"dim ecran:"+widthScreen+"x"+heightScreen);
tView1.setText("Bouton : " +(int)bouton);

tView2.setText("Angle : "+(int)angle);

//tView2.set(210);
//  tView2.setHeight(335);
//tView2.setWidth((int)widthScreen/2);
//tView2.setHeight((int)heightScreen/2);

Log.v("OnTouchDemo", "Angle"+Math.toDegrees(Math.tan(event.getX()/event.getX())));
}
return false;
}
});
//fin2

}

//debut 2 pour afficher le text



public int DrawMenu(int centreX,int centreY,int rayonCercle,int rayonPetitCercle,int nbPart,int dephasage,String colorBordure,String colorCentre){

//draw the circle
int rayonDuCercle = 10;
//canvas.drawCircle(centreX, centreY, rayonCercle, paint);


return 0;

}
// fin 2

private final void drawCircles
(
final Canvas cnv, final int width, final int height,
final float rayonDuCercle, final float rayonDuCerclePetit
)
{
//
// aficchons notre fameux cercle

pnt.setColor(Color.parseColor("#ffff0000"));
pnt.setStyle(Style.STROKE);
pnt.setStrokeWidth(10);
cnv.drawCircle((float) (cnv.getWidth() * .5),
(float) (cnv.getHeight() * .5), rayonDuCercle, pnt);
cnv.drawCircle((float) (cnv.getWidth() * .5),
(float) (cnv.getHeight() * .5), rayonDuCerclePetit, pnt);

// ????????????????????????????????????????????????????????????????
/*
Random rand = new Random(); //Affichons 100 segments de toutes
les couleurs for (int i=0; i < 100; i++) { // Affecter une
couleur de manière aléatoire paint.setARGB(255,
rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); //
Définir l'épaisseur du segment paint.setStrokeWidth
(rand.nextInt(10)); // Puis dessiner nos points dans le cavenas
canvas.drawLine(rand.nextInt(iWidth), rand.nextInt(iHeight),
rand.nextInt(iWidth), rand.nextInt(iHeight), paint); }
*/

pnt.setARGB(255, rnd.nextInt(256), rnd.nextInt(256),
rnd.nextInt(256));
// Définir l'épaisseur du segment
pnt.setStrokeWidth(2);

// ????????????????????????????????????????????????????????????????

// Puis dessiner nos points dans le cavenas
// okcanvas.drawLine((float)((float)Math.cos(0)*rayonDuCerclePetit)+canvas.getWidth()/2,
// canvas.getHeight()/2,canvas.getWidth()/2+rayonDuCercle,
// canvas.getHeight()/2, paint);
// okcanvas.drawLine((float)((float)Math.cos(Math.PI/2)*rayonDuCerclePetit)+canvas.getWidth()/2,
// ((float)Math.sin(Math.PI/2)*rayonDuCerclePetit)+canvas.getHeight()/2,canvas.getWidth()/2+rayonDuCercle*(float)Math.cos(Math.PI/2),
// rayonDuCercle*(float)Math.sin(Math.PI/2)+canvas.getHeight()/2,
// paint);
// okkk
// canvas.drawLine((float)((float)Math.cos(Math.PI/4)*rayonDuCerclePetit)+canvas.getWidth()/2,
// ((float)Math.sin(Math.PI/4)*rayonDuCerclePetit)+canvas.getHeight()/2,canvas.getWidth()/2+rayonDuCercle*(float)Math.cos(Math.PI/4),
// rayonDuCercle*(float)Math.sin(Math.PI/4)+canvas.getHeight()/2,


// paint);

// initPaint(paint,);
}

private final void drawRays
(
final Canvas cnv, final float rayonDuCercle,
final float rayonDuCerclePetit
)
{
// pourquoi j'utilise 2 boucles ? Parce que pour limiter l'espace
// memoire j'utilise le même canva et la seul difference entre ces
// deux element est la couleur.
// cette boucle affiche des rayons
//le .37 est le décalage 
for (int i = 8; i > -1; --i)
{
setRayon(cnv, (Math.PI *( .25)) * i+(.37), pnt, rayonDuCercle,
rayonDuCerclePetit);
}
}

private final void drawStars
(final Canvas cnv, final int width, final int height)
{
// j'ai l'impression detre dans les etoiles avec ces petits points


// Affichons (1/100th of screen size) points de toutes les couleurs
final int stars = (int) ((width * height) *.01);
for (int i = stars; i > 0; --i)
{
// Affecter une couleur de manière aléatoire
pnt.setARGB(255, rnd.nextInt(256), rnd.nextInt(256),
rnd.nextInt(256));
// Puis dessiner nos points dans le canevas
cnv.drawPoint(rnd.nextInt(width), rnd.nextInt(height), pnt);
}
}

/*
* info pour unen raison que j'ai pas chercher a comprendre l'angle
* positif s'affiche comme si c'été un ange negatif . Donc je bidouille
* en multipliant l'angle par -1
*/
void setRayon
(
final Canvas cnv, double angleRad, final Paint pnt,
final float rayonDuCercle, final float rayonDuCerclePetit
)
{
angleRad = (Math.toRadians(90) + angleRad) * -1;
cnv.drawLine
(

((float) Math.cos(angleRad) * rayonDuCerclePetit) +
(float) (cnv.getWidth() * .5),
((float) Math.sin(angleRad) * rayonDuCerclePetit) +
(float) (cnv.getHeight() * .5),
(float) (cnv.getWidth() * .5) + (rayonDuCercle *
(float) Math.cos(angleRad)),
(rayonDuCercle * (float) Math.sin(angleRad)) +
(float) (cnv.getHeight() * .5), pnt
);

//draw small circle
cnv.drawCircle((float)(((((float) Math.cos(angleRad) * rayonDuCerclePetit) +
(float) (cnv.getWidth() * .5))+((float) (cnv.getWidth() * .5) + (rayonDuCercle *

(float) Math.cos(angleRad+Math.toRadians(30)))))/2),
((((float) Math.sin(angleRad) * rayonDuCerclePetit) +
(float) (cnv.getHeight() * .5))+
(rayonDuCercle * (float) Math.sin(angleRad+Math.toRadians(30))) +
(float) (cnv.getHeight() * .5))/2, (float)(rayonDuCercle*.20), pnt);

//draw small circle in the midle
cnv.drawCircle((float)(cnv.getWidth() * .5),
(float) (cnv.getHeight() * .5), (float)(rayonDuCercle*.20), pnt);




}
}
}

1 个答案:

答案 0 :(得分:1)

从技术上讲,这不是一个错误;这是一个警告。你得到了这个,因为你在OnTouchListener方法中创建了一个onDraw对象。

因为onDraw经常被调用,所以它会降低性能。相反,你应该:

  • 仅在onDraw之外执行一次。例如,在onCreate
  • OnTouchListener保存在班级的变量中,初始化 onDraw 将其应用 onDraw