2017-10-05 2 views
2

Je crée une vue personnalisée. C'est essentiellement une boîte rectangle avec des bordures dedans. Je veux que la bordure change de couleur et la rende focalisable lorsqu'un utilisateur clique dessus. Je veux que la bordure revienne à la couleur d'origine si le rectangle perd son focus. Je veux utiliser cet arrière-plan comme arrière-plan de formulaire. J'ai essayé la documentation android et les réponses de débordement de pile et je ne peux pas faire ceci. Je l'ai fait cliquable mais je ne suis pas capable d'aller plus loin que ça.Comment rendre votre vue personnalisée focalisable?

public class FormBackgroundView extends View implements View.OnClickListener{ 

    private int _borderColor; 
    Paint fillPaint, strokePaint; 
    Canvas canvas; 

    public FormBackgroundView(Context context) { 
     super(context); 
     init(); 
    } 

    public FormBackgroundView(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public FormBackgroundView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    public FormBackgroundView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(); 
    } 

    private void init(){ 
     super.setOnClickListener(this); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     fillPaint = new Paint(); 
     strokePaint = new Paint(); 

     fillPaint.setStyle(Paint.Style.FILL); 
     fillPaint.setColor(Color.WHITE); 

     strokePaint.setStyle(Paint.Style.FILL); 
     strokePaint.setColor(Color.BLACK); 
     strokePaint.setAntiAlias(true); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 
      canvas.drawRoundRect(0,0,getWidth(),getHeight(), 10, 10, strokePaint); 
      canvas.drawRoundRect(0 + 3,0 + 3,getWidth() - 3,getHeight() - 3, 7, 7, fillPaint); 
     } else { 
      canvas.drawRect(0,0,getWidth(),getHeight(), strokePaint); 
      canvas.drawRect(0 + 4,0 + 4,getWidth() -4 ,getHeight() -4, fillPaint); 
     } 

     this.canvas = canvas; 
    } 



    @Override 
    public void onClick(View view) { 

    } 


} 
+1

double possible de [vue personnalisée ne répond pas aux touches ] (https://stackoverflow.com/questions/10406354/custom-view-not -responding-to-touch) – Danieboy

Répondre

1

Votre point de vue est pas automatiquement focalisable en mode tactile. Vous devez faire un appel à « setFocusableInTouchMode()` si vous voulez que votre vue d'obtenir le focus quand il est cliqué (touché.) Bien que daté, j'ai trouvé this explanation utile pour décrire le mode tactile.

Donc, dans votre init() add . setFocusableInTouchMode(true)

Deuxièmement, vous ne faites pas quelque chose de différent dans votre onDraw() si la vue est concentrée ou pas le changement à quelque chose comme ce qui suit:.

protected void onDraw(Canvas canvas) { 
    // your paint code 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     if (isFocused()) { // draw the border 
      canvas.drawRoundRect(0, 0, getWidth(), getHeight(), 10, 10, strokePaint); 
      canvas.drawRoundRect(0 + 3, 0 + 3, getWidth() - 3, getHeight() - 3, 7, 7, fillPaint); 
     } else { // don't draw the border 
      canvas.drawRoundRect(0, 0, getWidth(), getHeight(), 7, 7, fillPaint); 
     } 
    } else { 
     //similar here 
    } 
    // The rest of your code 
} 
+0

Merci pour votre réponse. Je veux demander une chose quand onDraw() est appelé. Je pensais que c'était appelé une seule fois. Est-ce qu'on l'appelle à nouveau quand la mise au point change? – killerprince182

+0

ou lorsque invalidate() est appelé par nous? – killerprince182

+0

@ killerprince182 Oui, il s'appelle. Pour une vue focalisable, il y a généralement une indication visuelle que la vue a le focus, donc il est logique que 'onDraw()' soit appelé. – Cheticamp

1

Essayez ceci:

public class FormBackGroundView extends View { 

    private int _borderColor; 
    Paint fillPaint, strokePaint; 
    Canvas canvas; 
    private boolean isFocused; 

    public FormBackGroundView(Context context) { 
     super(context); 
     init(); 
    } 

    public FormBackGroundView(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public FormBackGroundView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     fillPaint = new Paint(); 
     strokePaint = new Paint(); 
     fillPaint.setStyle(Paint.Style.FILL); 
     strokePaint.setStyle(Paint.Style.FILL); 
     strokePaint.setAntiAlias(true); 
     setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && !isFocused) { 
        isFocused = true; 
        invalidate(); 
       } else if (motionEvent.getAction() == MotionEvent.ACTION_UP && isFocused) { 
        isFocused = false; 
        invalidate(); 
       } 
       return true; 
      } 
     }); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 


     fillPaint.setColor(Color.WHITE); 

     strokePaint.setColor(isFocused? Color.RED:Color.BLACK); 


     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      canvas.drawRoundRect(0, 0, getWidth(), getHeight(), 10, 10, strokePaint); 
      canvas.drawRoundRect(0 + 3, 0 + 3, getWidth() - 3, getHeight() - 3, 7, 7, fillPaint); 
     } else { 
      canvas.drawRect(0, 0, getWidth(), getHeight(), strokePaint); 
      canvas.drawRect(0 + 4, 0 + 4, getWidth() - 4, getHeight() - 4, fillPaint); 
     } 
    } 
} 
+0

Ce code a un problème. La forme revient à la normale dès que le formulaire est arrêté de toucher. – killerprince182