вызов метода, имеющего параметры context и attributeset из MainActivity

#java #android #custom-view

#java #Android #пользовательский вид

Вопрос:

У меня есть приложение, которое отображает случайные символы по вертикали на экране (как в фильме «Матрица»), и я хотел бы добавить кнопки для изменения цвета этих символов при нажатии, но я не могу вызвать метод setColor paintTxt переменной from MainActivity .

Это мой код,

 EffetMatrix effetMatrix = new EffetMatrix();//Error in ()
final Paint paintTxt = effetMatrix.paintTxt;
paintTxt.setColor(Color.RED);
  

Но редактор показывает ошибку:

EffetMatrix(контекст, набор атрибутов) в EffetMatrix не может быть применен к ()

код класса EffetMatrix

пакет com.esqmo.apps.effetmatrix;

 import java.util.Random;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.content.Context;
import android.widget.Button;    

/**
 * Created by esQmo on 04/10/2016.
 */
public class EffetMatrix extends View {
    private static final Random ALEATOIRE = new Random();
    private int larg, haut;
    private Canvas toile;
    private Bitmap toileBmp;
    private int taillePolice = 40;
    private int tailleColonne;
    private char[] chars = "01".toCharArray();
    private int[] posTxtParColonne;
    public Paint peindreTxt, peindreArrPlan, peindreArrPlanBmp, peindreInitArrPlan;

    public EffetMatrix(Context context, AttributeSet attrs) {
        super(context, attrs);

        peindreTxt = new Paint();
        peindreTxt.setStyle(Paint.Style.FILL);
        peindreTxt.setColor(Color.BLUE);
        peindreTxt.setTextSize(taillePolice);

        peindreArrPlan = new Paint();
        peindreArrPlan.setStyle(Paint.Style.FILL);
        peindreArrPlan.setColor(Color.BLACK);
        peindreArrPlan.setAlpha(5);

        peindreArrPlanBmp = new Paint();
        peindreArrPlanBmp.setColor(Color.BLACK);

        peindreInitArrPlan = new Paint();
        peindreInitArrPlan.setColor(Color.BLACK);
        peindreInitArrPlan.setAlpha(255);
        peindreInitArrPlan.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onSizeChanged(int l, int h, int ancl, int anch) {
        super.onSizeChanged(l, h, ancl, anch);

        larg = l;
        haut = h;

        toileBmp = Bitmap.createBitmap(larg, haut, Bitmap.Config.ARGB_8888);
        toile = new Canvas(toileBmp);
        toile.drawRect(0, 0, larg, haut, peindreInitArrPlan);
        tailleColonne = larg / taillePolice;

        posTxtParColonne = new int[tailleColonne   1];

        for (int x = 0; x < tailleColonne; x  ) {
            posTxtParColonne[x] = ALEATOIRE.nextInt(larg / 2)   1;
        }

    }

    private void dessineTexte() {
        for (int i = 0; i < posTxtParColonne.length; i  ) {
            toile.drawText(""   chars[ALEATOIRE.nextInt(chars.length)], i * taillePolice,
                    posTxtParColonne[i] * taillePolice, peindreTxt);
            if (posTxtParColonne[i] * taillePolice > larg amp;amp; Math.random() > 0.980) {
                posTxtParColonne[i] = 0;
            }
            posTxtParColonne[i]  ;
        }
    }

    private void dessineToile() {
        toile.drawRect(0, 0, larg, haut, peindreArrPlan);
        dessineTexte();
    }

    @Override
    protected void onDraw(Canvas toile) {
        super.onDraw(toile);
        toile.drawBitmap(toileBmp, 0, 0, peindreArrPlanBmp);
        dessineToile();
        invalidate();
    }
    public void setCustomColor(int color){
        peindreTxt.setColor(color);
        invalidate();
    }


}
  

примечание: переменная peindreText = paintText

Основной код деятельности:

 package com.esqmo.apps.effetmatrix;

import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.effect.Effect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements  View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button boutton_vert = (Button) findViewById(R.id.b_v);
        final Button boutton_bleu = (Button) findViewById(R.id.b_b);
        final Button boutton_rouge = (Button) findViewById(R.id.b_r);
        final Button boutton_rose = (Button) findViewById(R.id.b_ro);

        boutton_bleu.setOnClickListener(this);
        boutton_vert.setOnClickListener(this);
        boutton_rouge.setOnClickListener(this);
        boutton_rose.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

    }


    public void passerVert(View v) {

    }

    public void passerRouge(View v) {

    }

    public void passerRose(View v) {

    }

    public void passerBleu(View v) {


    }
}
  

main.xml

 <com.esqmo.apps.effetmatrix.EffetMatrix
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@ id/arrPlan"/>

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"
    android:background="#040404"
    android:id="@ id/linearLayout">

    <Button
        android:layout_width="70dp"
        android:layout_height="match_parent"
        android:text="@string/button_vert"
        android:onClick="passerVert"
        android:id="@ id/b_v"
        android:textAppearance="@android:color/holo_blue_dark" />

    <Button
        android:layout_width="70dp"
        android:layout_height="match_parent"
        android:text="@string/button_bleu"
        android:onClick="passerBleu"
        android:id="@ id/b_b"/>

    <Button
        android:layout_width="70dp"
        android:layout_height="match_parent"
        android:text="@string/button_rouge"
        android:onClick="passerRouge"
        android:id="@ id/b_r" />

    <Button
        android:layout_width="70dp"
        android:layout_height="match_parent"
        android:text="@string/button_rouge"
        android:onClick="passerRose"
        android:id="@ id/b_ro" />



</LinearLayout>
  

PS: Я новичок в программировании.
Извините за мой английский

Комментарии:

1. Является EffetMatrix ли пользовательское представление?

2. Неясно, что EffetMatrix это такое, но какие параметры вас смущают?

3. Вам нужно будет показать нам свою реализацию EffectMatrix , чтобы мы могли отладить это.

4. да, это @K Neeraj Lal

5. У вас это уже есть в xml? Кроме того, вы можете отредактировать EffetMatrix класс или он предварительно скомпилирован?

Ответ №1:

Не создавайте новый экземпляр пользовательского представления снова. Вместо этого получите ссылку на представление, используя его идентификатор.

Смотрите следующий код,

 EffetMatrix effetMatrix = (EffetMatrix) findViewById(R.id.arrPlan);
effetMatrix.setCustomTextColor(Color.RED);
  

Внутри EffetMatrix класса создайте метод с именем setCustomColor следующим образом,

 class EffetMatrix {
    ...

    public void setCustomTextColor(int color){
        // Set the color to the paintTxt object
        paintTxt.setColor(color);
        // invalidate the view to apply the changes
        invalidate();
    }

    ...
}
  

Вот как вы это реализуете в своем коде,

 public class MainActivity extends AppCompatActivity implements  View.OnClickListener {
    EffetMatrix effetMatrix;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        effetMatrix = (EffetMatrix) findViewById(R.id.arrPlan);        
        ...
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.b_b:
                effetMatrix.setCustomTextColor(Color.BLUE);
                break;
            case R.id.b_r:
                effetMatrix.setCustomTextColor(Color.RED);
                break;
            case R.id.b_ro:
                effetMatrix.setCustomTextColor(Color.MAGENTA);
                break;
        }
    }
}
  

Ответ №2:

Вы должны аннулировать свой пользовательский вид после изменения цвета рисования.

 effetMatrix.invalidate();
  

И если вы хотите отобразить свой пользовательский вид в редакторе, вы должны реализовать :

 public EffetMatrix(Context context) {
    this(context, null);
}

public EffetMatrix(Context context, AttributeSet attrs) {
    super(context, attrs);  
}
  

Комментарии:

1. приложение на моем телефоне работает нормально, но я хотел добавить кнопки, с помощью которых я могу изменять цвет символов. например, когда я нажимаю на кнопку для синего цвета; все символы становятся синими…

2. @esQmo хорошо, просто вызовите метод invalidate() после изменения цвета рисования. effetMatrix.invalidate();

Ответ №3:

Если вы хотите, чтобы кнопки что-то делали, вам нужно правильно установить onClickListener для каждой кнопки в вашем main . Вот пример для button_bleu ,

Избавьтесь от boutton_bleu.setOnClickListener(this); него и замените на

 button_bleu.setOnClickListener(new OnClickListener()
    {
      public void onClick(View v)
      {
         effetMatrix.setCustomColor(Color.BLUE);
      }
    });
  

Теперь просто сделайте то же самое для остальных 3 кнопок.

Комментарии:

1. Спасибо, Крис, но effetMatrix.setCustomTextColor(Color.blue); возвращает не может разрешить символ ‘effetMatrix’

2. @esQmo вы неправильно написали «effectMatrix»? Я полагаю, что вы написали его «effetMatrix» без «c»

3. effectMatrix или effetMatrix ? я думал, вы неправильно его написали

4. @esQmo моя ошибка, вы правы, это «effetMatrix», и я отредактировал свой ответ, чтобы он соответствовал вашему методу, «setCustomColor»

5. хорошо, но здесь все еще не удается разрешить символ. Я не знаю, где я ошибаюсь… setCustomTextColor определен в классе EffetMatrix