Android Java Приложению Paint требуется возможность очистки Canvas / PaintView - PullRequest
0 голосов
/ 20 июня 2020

После выполнения учебника для создания простого Android Java приложения для рисования у меня есть приложение с 3 вкладками (приложение нижней панели навигации), которое позволяет мне рисовать на первом представлении / вкладка (HomeFragment) в порядке. Рисование отлично работает! Но мне нужно подключить функцию очистки, и у меня возникают проблемы с этим. Кроме того, как ни странно, если я нарисую что-нибудь в режиме рисования, а затем перейду к любой из двух других вкладок, мой рисунок исчезнет, ​​когда я вернусь на первую вкладку (HomeFragment). Может ли кто-нибудь предложить решение здесь или связать меня с решением, которое будет работать с таким многопрофильным приложением, как мое? Я нашел множество решений для приложений рисования с одним представлением, но я столкнулся с потоком проблем с нулевым указателем, когда пытаюсь реализовать эти решения для своего приложения с несколькими представлениями, потому что я не инициализирую и не создаю экземпляры необходимых объектов правильно.

Любые отзывы и предложения будут очень благодарны!

Вот моя MainActivity. java file:

import com.example.mobile_testapp_android_2.ui.home.PaintView;
import com.google.android.material.bottomnavigation.BottomNavigationView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PaintView paintView = new PaintView(this);
        //setContentView(paintView);
        setContentView(R.layout.activity_main);
        BottomNavigationView navView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                R.id.navigation_home, R.id.navigation_gui, R.id.navigation_calendar)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(navView, navController);

    }

}

Вот мой HomeFragment:

    import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.example.mobile_testapp_android_2.R;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class HomeFragment extends Fragment {

    private PaintView paintView;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        PaintView homeFragmentView = new PaintView(requireContext());

        this.paintView = new PaintView(requireContext());

        return homeFragmentView;
    }

    //Enable Clear Menu in this fragment
@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        //inflate menu
        inflater.inflate(R.menu.menu_swipes, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
//Handle menu item clicks here
        int id = item.getItemId();
        if (id == R.id.action_clearScreen) {
            //do clear function here:
            paintView.clearView();
            Toast.makeText(getActivity(), "Clear Screen", Toast.LENGTH_SHORT).show();
        }
        return super.onOptionsItemSelected(item);
    }
}

Вот мой PaintView:

    import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

public class PaintView extends View {

    public ViewGroup.LayoutParams params;
    private Path myPath = new Path();
    private Paint brush = new Paint();
    private boolean forceClear;

    public PaintView(Context context) {
        super(context);

        brush.setAntiAlias(true);
        brush.setColor(Color.MAGENTA);
        brush.setStyle(Paint.Style.STROKE);
        brush.setStrokeJoin(Paint.Join.ROUND);
        brush.setStrokeWidth(8f);

        params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }

    //Clear function
    public void clearView() {
        try {
            forceClear = true;
            invalidate();
        } catch (Exception ee) {
            Log.d("Clear Button: ", "We blew up!! " + ee);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float pointX = event.getX();
        float pointY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                myPath.moveTo(pointX, pointY);
                return true;
            case MotionEvent.ACTION_MOVE:
                myPath.lineTo(pointX, pointY);
                break;
            default:
                return false;
        }
        //Update the screen
        postInvalidate();
        return false;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (forceClear) {
            canvas.drawColor(Color.WHITE);
            forceClear = false;
        } else {
            canvas.drawPath(myPath, brush);
        }

    }
}

Вот скриншоты моего приложения:

PaintView with no drawing. [PaintView with drawing. 3 [Clear option in Options Menu selected for the PaintView.] 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...