0

J'ai créé une vue personnalisée comme une vue de recadrage qui est utilisée dans mon application pour définir la zone de rognage. Mais l'application se bloque tout en gonflant la vue. Peut-être que je n'ai pas compris comment utiliser la setColor correctement. J'ai essayé d'utiliser: BoxPaint.setColor(AppShared.gResources.getColor(R.color.bwff_60)), l'application est toujours tombé en panne. S'il vous plaît dites-moi ce que tous les changements que je devrais faire dans le code afin que je puisse voir la vue.Comment définir correctement la couleur dans une vue personnalisée

Logcat: enter image description here enter image description here

main.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/com.md.areadectest" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <FrameLayout 
     android:id="@+id/layoutMain" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
     <RelativeLayout android:layout_width="@dimen/width_320" android:layout_height="@dimen/width_240" android:layout_centerInParent="true"> 
     <SurfaceView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/preview"> 
     </SurfaceView> 
      <FrameLayout android:layout_gravity="center" android:id="@+id/layoutDetectArea" android:background="@color/blue" android:layout_width="match_parent" android:layout_height="match_parent"> 
       <com.md.areadectest.AreaDetectorView android:id="@+id/viewDetector" android:layout_width="match_parent" android:layout_height="match_parent" /> 
      </FrameLayout> 
     </RelativeLayout> 
    </FrameLayout> 

    <LinearLayout 
     android:layout_below="@id/layoutMain" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:gravity="center"> 
    </LinearLayout> 

    <ImageView android:id="@+id/myImageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_android_black_24dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/trigcount" 
     android:layout_alignTop="@+id/myImageView" 
     android:layout_centerHorizontal="true" 
     android:textColor="@android:color/white" /> 

</RelativeLayout> 

View.java

public class AreaDetectorView extends LinearLayout { 

    public static int Width; 
    public static int Height; 
    private static Paint BoxPaint = null; 
    private static Paint BoxPaint2 = null; 
    private static Paint TextPaint = null; 
    private static Paint ArrowPaint = null; 
    private static Path mPath = null; 
    private static Rect mRect = null; 
    private static int lastX, lastY = 0; 
    private static boolean mBoxTouched = false; 
    private static boolean mArrowTouched = false; 
    private static Context mContext; 
    private static int ArrowWidth = 0; 

    public AreaDetectorView(Context context) { 
     super(context); 
    } 
//attrs was not there 
    public AreaDetectorView(Context context, AttributeSet attrs) { 
     super(context,attrs); 
     // TODO Auto-generated constructor stub 
     if (!this.getRootView().isInEditMode()) { 
      ArrowWidth =GetDisplayPixel(context, 30); 
     } 

     //InitDetectionArea(); 

     InitMemberVariables(); 
     setWillNotDraw(false); 
    } 
    public static int GetDisplayPixel(Context paramContext, int paramInt) 
    { 
     return (int)(paramInt * paramContext.getResources().getDisplayMetrics().density + 0.5F); 
    } 

    public static void InitMemberVariables() { 
     if (BoxPaint == null) { 
      BoxPaint = new Paint(); 
      BoxPaint.setAntiAlias(true); 
      BoxPaint.setStrokeWidth(2.0f); 
      //BoxPaint.setStyle(Style.STROKE); 
      BoxPaint.setStyle(Style.FILL_AND_STROKE); 
      BoxPaint.setColor(ContextCompat.getColor(mContext, R.color.bwff_60)); 
     } 
     if (ArrowPaint == null) { 
      ArrowPaint = new Paint(); 
      ArrowPaint.setAntiAlias(true); 
      ArrowPaint.setColor(ContextCompat.getColor(mContext,R.color.redDD)); 
      ArrowPaint.setStyle(Style.FILL_AND_STROKE); 
     } 
     if (TextPaint == null) { 
      TextPaint = new Paint(); 
      TextPaint.setColor(ContextCompat.getColor(mContext,R.color.yellowL)); 
      TextPaint.setTextSize(16); 
      //txtPaint.setTypeface(lcd); 
      TextPaint.setStyle(Style.FILL_AND_STROKE); 
     } 
     if (mPath == null) { 
      mPath = new Path(); 
     } else { 
      mPath.reset(); 
     } 
     if (mRect == null) { 
      mRect = new Rect(); 
     } 

     if (BoxPaint2 == null) { 
      BoxPaint2 = new Paint(); 
      BoxPaint2.setAntiAlias(true); 
      BoxPaint2.setStrokeWidth(2.0f); 
      //BoxPaint.setStyle(Style.STROKE); 
      BoxPaint2.setStyle(Style.STROKE); 
      BoxPaint2.setColor(ContextCompat.getColor(mContext,R.color.bwff_9e)); 
     } 

    } 

    public static void InitDetectionArea() { 
     try { 
      int w = Preferences.DetectionArea.width(); 
      int h = Preferences.DetectionArea.height(); 
      int x = Preferences.DetectionArea.left; 
      int y = Preferences.DetectionArea.top; 

      // ver 2.6.0 
      if (Preferences.DetectionArea.left == 1 
        && Preferences.DetectionArea.top == 1 
        && Preferences.DetectionArea.right == 1 
        && Preferences.DetectionArea.bottom == 1) { 

       w = Preferences.DisplayWidth/4; 
       h = Preferences.DisplayHeight/3; 

       // ver 2.5.9 
       w = Width/4; 
       h = Height/3; 

       Preferences.DetectorWidth = w;  
       Preferences.DetectorHeight = h; 

       x = (Preferences.DisplayWidth/2) - (w/2); 
       y = (Preferences.DisplayHeight/2) - (h/2); 

       // ver 2.5.9 
       x = (Width/2) - (w/2); 
       y = (Height/2) - (h/2); 

      } 

      //Preferences.DetectionArea = new Rect(x, x, x + Preferences.DetectorWidth, x + Preferences.DetectorHeight); 
      Preferences.DetectionArea = new Rect(x, y, x + w, y + h); 

      Preferences.gDetectionBitmapInt = new int[Preferences.DetectionArea.width() * Preferences.DetectionArea.height()]; 
      Preferences.gDetectionBitmapIntPrev = new int[Preferences.DetectionArea.width() * Preferences.DetectionArea.height()]; 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void SetDetectionArea(int x, int y, int w, int h) { 
     try { 
      Preferences.DetectionArea = new Rect(x, y, w, h); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void DrawAreaBox(Canvas canvas) { 
     try { 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     try { 
      if (this.getRootView().isInEditMode()) { 
       super.dispatchDraw(canvas); 
       return; 
      } 

      //Preferences.DetectionAreaOrient = UtilGeneralHelper.GetDetectRectByOrientation(); 

      canvas.drawColor(0); 
      mPath.reset(); 

      canvas.drawRect(Preferences.DetectionArea, BoxPaint); 

      mPath.moveTo(Preferences.DetectionArea.right - ArrowWidth, Preferences.DetectionArea.bottom); 
      mPath.lineTo(Preferences.DetectionArea.right, Preferences.DetectionArea.bottom - ArrowWidth); 
      mPath.lineTo(Preferences.DetectionArea.right, Preferences.DetectionArea.bottom); 
      mPath.lineTo(Preferences.DetectionArea.right - ArrowWidth, Preferences.DetectionArea.bottom); 
      mPath.close(); 
      canvas.drawPath(mPath, ArrowPaint); 

      mPath.reset(); 
      //canvas.drawRect(Preferences.DetectionAreaOrient, BoxPaint2); 
      //canvas.drawRect(Preferences.DetectionAreaOrientPort, BoxPaint2); 

      TextPaint.setTextSize(16); 
      TextPaint.setColor(ContextCompat.getColor(mContext,R.color.bwff)); 

      TextPaint.getTextBounds(getResources().getString(R.string.str_detectarea), 0, 1, mRect); 
      canvas.drawText(getResources().getString(R.string.str_detectarea), 
        Preferences.DetectionArea.left + 4, 
        Preferences.DetectionArea.top + 4 + mRect.height(), 
        TextPaint); 
      int recH = mRect.height(); 

      TextPaint.setStrokeWidth(1.2f); 
      TextPaint.setTextSize(18); 
      TextPaint.setColor(ContextCompat.getColor(mContext,R.color.redD_9e)); 
      TextPaint.getTextBounds(getResources().getString(R.string.str_dragandmove), 0, 1, mRect); 
      canvas.drawText(getResources().getString(R.string.str_dragandmove), 
        Preferences.DetectionArea.left + 4, 
        Preferences.DetectionArea.top + 20 + mRect.height()*2, 
        TextPaint); 

      TextPaint.getTextBounds(getResources().getString(R.string.str_scalearea), 0, 1, mRect); 
      canvas.drawText(getResources().getString(R.string.str_scalearea), 
        Preferences.DetectionArea.left + 4, 
        Preferences.DetectionArea.top + 36 + mRect.height()*3, 
        TextPaint); 

      super.dispatchDraw(canvas); 
      //canvas.restore(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     try { 
      super.onDraw(canvas); 
      invalidate(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 

     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     boolean retValue = true; 
     int X = (int)event.getX(); 
     int Y = (int)event.getY(); 

     //AppMain.txtLoc.setText(String.valueOf(X) + ", " + String.valueOf(Y)); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       mBoxTouched = TouchedInBoxArea(X, Y); 

       //AppMain.txtLoc.setText("BoxTouched: " + String.valueOf(mBoxTouched)); 

       if (!mBoxTouched) break; 

       lastX = X; 
       lastY = Y; 

       BoxPaint.setStyle(Style.FILL_AND_STROKE); 
       BoxPaint.setColor(ContextCompat.getColor(mContext,R.color.redD_9e)); 

       mArrowTouched = TouchedInArrow(X, Y); 
       //AppMain.txtLoc.setText("ArrowTouched: " + String.valueOf(mBoxTouched)); 

       if (mArrowTouched) { 
        ArrowPaint.setColor(ContextCompat.getColor(mContext,R.color.bwff_9e)); 
       } 

       break; 

      case MotionEvent.ACTION_MOVE: 
       if (!mBoxTouched) break; 

       int moveX = X - lastX; 
       int moveY = Y - lastY; 

       //AppMain.txtLoc.setText("Move X, Y: " + String.valueOf(moveX) + "," + String.valueOf(moveY)); 
       if (!mArrowTouched) { 
        if (Preferences.DetectionArea.left + moveX < 0) { 
         break; 
        } 
//    if (Preferences.DetectionArea.right + moveX > Preferences.gDisplay.getWidth()) { 
//     break; 
//    } 
        // ver 2.5.9 
        if (Preferences.DetectionArea.right + moveX > Width) { 
         break; 
        } 
        if (Preferences.DetectionArea.top + moveY < 0) { 
         break; 
        } 
//    if (Preferences.DetectionArea.bottom + moveY > Preferences.gDisplay.getHeight()) { 
//     break; 
//    } 
        // ver 2.5.9 
        if (Preferences.DetectionArea.bottom + moveY > Height) { 
         break; 
        } 
       } 

       if (mArrowTouched) { 
        if ((Preferences.DetectionArea.width() + moveX) < ArrowWidth * 2){ 
         break; 
        } 
        if ((Preferences.DetectionArea.height() + moveY) < ArrowWidth * 2) { 
         break; 
        } 
        Preferences.DetectionArea.right += moveX; 
        Preferences.DetectionArea.bottom += moveY; 
        //Log.i("DBG", "W,H: " + String.valueOf(Preferences.DetectionArea.width()) + "," + String.valueOf(Preferences.DetectionArea.height())); 
       } else { 
        Preferences.DetectionArea.left += moveX; 
        Preferences.DetectionArea.right += moveX; 
        Preferences.DetectionArea.top += moveY; 
        Preferences.DetectionArea.bottom += moveY; 
       } 

       lastX = X; 
       lastY = Y; 

       //AppMain.txtLoc.setText(String.valueOf(Preferences.DetectionArea.left) + ", " + String.valueOf(Preferences.DetectionArea.top)); 
       break; 

      case MotionEvent.ACTION_UP: 
       mBoxTouched = false; 
       mArrowTouched = false; 
       //BoxPaint.setStyle(Style.STROKE); 
       BoxPaint.setStyle(Style.FILL_AND_STROKE); 
       BoxPaint.setColor(ContextCompat.getColor(mContext,R.color.bwff_60)); 
       ArrowPaint.setColor(ContextCompat.getColor(mContext,R.color.redDD)); 
       //AppMain.txtLoc.setText(String.valueOf(Preferences.DetectionArea.left) + ", " + String.valueOf(Preferences.DetectionArea.top)); 

       if (Preferences.DetectionArea.left < 0) { 
        Preferences.DetectionArea.left = 0; 
       } 
//   if (Preferences.DetectionArea.right > Preferences.gDisplay.getWidth()) { 
//    Preferences.DetectionArea.right = Preferences.gDisplay.getWidth(); 
//   } 
       // ver 2.5.9 
       if (Preferences.DetectionArea.right > Width) { 
        Preferences.DetectionArea.right = Width; 
       } 
       if (Preferences.DetectionArea.top < 0) { 
        Preferences.DetectionArea.top = 0; 
       } 
//   if (Preferences.DetectionArea.bottom > Preferences.gDisplay.getHeight()) { 
//    Preferences.DetectionArea.bottom = Preferences.gDisplay.getHeight(); 
//   } 
       if (Preferences.DetectionArea.bottom > Height) { 
        Preferences.DetectionArea.bottom = Height; 
       } 

       Preferences.gDetectionBitmapInt = new int[Preferences.DetectionArea.width() * Preferences.DetectionArea.height()]; 
       Preferences.gDetectionBitmapIntPrev = new int[Preferences.DetectionArea.width() * Preferences.DetectionArea.height()]; 
       //Preferences.gDetectionBitmapInt = null; 
       //Preferences.gDetectionBitmapIntPrev = null; 

       String area = String.valueOf(Preferences.DetectionArea.left) 
         + "," + String.valueOf(Preferences.DetectionArea.top) 
         + "," + String.valueOf(Preferences.DetectionArea.right) 
         + "," + String.valueOf(Preferences.DetectionArea.bottom); 

       // UtilGeneralHelper.SavePreferenceSetting(Preferences.gContext, Preferences.PREF_DETECTION_AREA_KEY, area); 

       break; 
     } 


     invalidate(); 
     return retValue; 
    } 

    private boolean TouchedInBoxArea(int x, int y) { 
     boolean retValue = false; 
     try { 

      if (x > Preferences.DetectionArea.left && x < Preferences.DetectionArea.right) { 
       if (y > Preferences.DetectionArea.top && y < Preferences.DetectionArea.bottom) { 
        retValue = true; 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return retValue; 
    } 

    private boolean TouchedInArrow(int x, int y) { 
     boolean retValue = false; 
     try { 

      if (x > Preferences.DetectionArea.right - ArrowWidth && x < Preferences.DetectionArea.right) { 
       if (y > Preferences.DetectionArea.bottom - ArrowWidth && y < Preferences.DetectionArea.bottom) { 
        retValue = true; 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return retValue; 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int width = MeasureSpec.getSize(widthMeasureSpec); 
     int height = MeasureSpec.getSize(heightMeasureSpec); 
     setMeasuredDimension(width, height); 
     Width = width; 
     Height = height; 
     InitDetectionArea(); 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     // TODO Auto-generated method stub 
     for (int i = 0; i < this.getChildCount()-1; i++){ 
      (this.getChildAt(i)).layout(l, t, r, b); 
     } 

     if (changed) { 
      // check width height 
      if (r != Width || b != Height) { 
       // size does not match 
      } 
     } 
    } 
} 
+1

fournir votre fichier xml parce que quelque chose ne va pas dans votre xml – anddevmanu

+0

J'ai mis à jour le xml –

+1

pouvez-vous s'il vous plaît fournir votre nom de paquet de AreaDetectorView – anddevmanu

Répondre

2

Le probl em est que votre variable mContext est nulle - vous devez définir mContext = context dans vos constructeurs.

+0

Merci cela a corrigé le crash. Mais la vue ne ressemble pas à ce que je voulais. J'essaye de faire une application de détection de mouvement et cette vue est destinée à gonfler au-dessus d'une vue de surface pour définir la zone de détection. Maintenant tout ce que je peux voir est cette vue personnalisée. –

+2

@DioptrePic pourriez-vous fournir des informations plus détaillées sur ce à quoi il ressemble? Il est plus facile de chercher le problème ensuite;) – Katharina

0

Essayez ceci:

BoxPaint.setColor(getResources().getColor(R.color.bwff_60)); 

couleur appliquer uniquement lorsque vous avez ajouté à votre projet \ app \ src \ \ res principales \ valeurs \ Colors.xml fichier.