首页 > 解决方案 > 带手指路径的着色书

问题描述

我对这一切都很陌生,我正在为孩子们创建一个应用程序,其中包括一个着色书类别。老实说,我发现了我不太明白的着色书的以下代码。但我面临一个问题,即此代码在点击时填写。这意味着绘图的单击部分会被选定的颜色填充。但我的想法是通过移动手指来为图片着色(就像绘画但有颜色)但老实说我不知道​​该怎么做。

这是代码

图画书课

Public class ColoringBook extends AppCompatActivity {

    RecyclerView recyclerView;
    ImageAdapter adapter;
    //creating variables
    Button back;
    Toolbar toolbar;
    TextView toolText;

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


        //Assign action bar
        toolbar = findViewById(R.id.toolbar3);
        setSupportActionBar(toolbar);
        //assign TextView in Toolbar
        toolText = findViewById(R.id.toolbar3_text);
        //setText of TextView in Toolbar
        toolText.setText("Coloring Book");

        //Assign back button
        back = findViewById(R.id.back);

        //setOnClickListener for back btn
        back.setOnClickListener(new View.OnClickListener() {
            //onClick for back button
            @Override
            public void onClick(View v) {
                Intent mainIntent = new Intent(ColoringBook.this, MainActivity.class);
                startActivity(mainIntent);
            }//end of onClick
        });//end of setOnClickListener


        initView();


    }

    private void initView() {

        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false);

        recyclerView = findViewById(R.id.recycle_view_images);

        recyclerView.setLayoutManager(gridLayoutManager);

        adapter = new ImageAdapter(this);

        recyclerView.setAdapter(adapter);
    }
}

普通类

public class Common {

    public static int COLOR_SELECTED = Color.RED;
    public static int PICTURE_SELECTED;

}

洪水填充类

public class FloodFill {
    public static void floodFill(Bitmap bitmap, Point point, int targetColor, int newColor){
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        if(targetColor != newColor){

            Queue<Point> queue = new LinkedList<>();
            do{
                int x = point.x;
                int y = point.y;

                while (x>0 && bitmap.getPixel(x-1,y)==targetColor){
                    x--;
                }

                boolean spanUp = false;
                boolean spandDown = false;

                while (x < width && bitmap.getPixel(x,y) == targetColor){
                    bitmap.setPixel(x,y,newColor);

                    if (!spanUp && y>0 && bitmap.getPixel(x,y-1)==targetColor){
                        queue.add(new Point(x,y-1));
                        spanUp = true;
                    }else if(spanUp && y>0 && bitmap.getPixel(x,y-1)==targetColor){
                        spanUp = false;
                    }

                    if(!spandDown && y<height-1 && bitmap.getPixel(x,y+1)==targetColor){
                        queue.add(new Point(x,y+1));
                        spandDown=true;
                    }else if (spandDown && y<height-1 && bitmap.getPixel(x,y+1)!=targetColor){
                        spandDown = false;
                    }

                    x++;

                }

            }while((point=queue.poll())!=null);


        }
    }
}

图像适配器类

public class ImageAdapter extends RecyclerView.Adapter<ImageViewHolder> {

    private Context mContext;
    private List<Integer> listImages;

    public ImageAdapter(Context mContext) {
        this.mContext = mContext;
        this.listImages = getImages();
    }

    private List<Integer> getImages() {
        List<Integer> results = new ArrayList<>();
        results.add(R.drawable.lion_coloring);
        results.add(R.drawable.turtle_coloring);
        results.add(R.drawable.leopard_coloring);
        results.add(R.drawable.elephant_coloring);
        results.add(R.drawable.shark_coloring);

        return results;
    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_images, parent, false);
        return new ImageViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {

        holder.imageView.setImageResource(listImages.get(position));
        holder.setImageOnClick(new ImageOnClick() {
            @Override
            public void onClick(int pos) {
                Common.PICTURE_SELECTED = listImages.get(pos);
                mContext.startActivity(new Intent(mContext, PaintActivity.class));

            }
        });

    }

    @Override
    public int getItemCount() {
        return listImages.size();
    }
}

ImageOnClick 接口

public interface ImageOnClick {

    void onClick(int pos);
}

ImageViewHolder 类

public class ImageViewHolder extends RecyclerView.ViewHolder {

    public ImageView imageView;
    private ImageOnClick imageOnClick;

    public void setImageOnClick(ImageOnClick imageOnClick) {
        this.imageOnClick = imageOnClick;
    }

    public ImageViewHolder(@NonNull View itemView) {
        super(itemView);

        imageView = itemView.findViewById(R.id.image_outline);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageOnClick.onClick(getAdapterPosition());
            }
        });
    }
}

绘画活动

public class PaintActivity extends AppCompatActivity implements SpectrumPalette.OnColorSelectedListener {

    //creating variables
    Button back;
    Toolbar toolbar;
    TextView toolText;

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


        //Assign action bar
        toolbar = findViewById(R.id.toolbar3);
        setSupportActionBar(toolbar);
        //assign TextView in Toolbar
        toolText = findViewById(R.id.toolbar3_text);
        //setText of TextView in Toolbar
        toolText.setText("Paint");

        //Assign back button
        back = findViewById(R.id.back);

        //setOnClickListener for back btn
        back.setOnClickListener(new View.OnClickListener() {
            //onClick for back button
            @Override
            public void onClick(View v) {
                Intent mainIntent = new Intent(PaintActivity.this, ColoringBook.class);
                startActivity(mainIntent);
            }//end of onClick
        });//end of setOnClickListener


        SpectrumPalette spectrumPalette = findViewById(R.id.palette);
        spectrumPalette.setOnColorSelectedListener(this);

    }

    @Override
    public void onColorSelected(int color) {
        Common.COLOR_SELECTED = color;
    }
}

PaintView 类

public class PaintView extends View {

    Bitmap bitmap;

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

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


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        Bitmap srcBitmp = BitmapFactory.decodeResource(getResources(), Common.PICTURE_SELECTED);
        bitmap = Bitmap.createScaledBitmap(srcBitmp,w,h,false);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(bitmap,0,0,null);
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        paint((int)event.getX(),(int)event.getY());
        return true;
    }

    private void paint(int x, int y) {
    int targetColor = bitmap.getPixel(x,y);
        FloodFill.floodFill(bitmap, new Point(x,y), targetColor,Common.COLOR_SELECTED);
        invalidate();
    }

}

请原谅我糟糕的英语。任何帮助或支持将不胜感激。

提前致谢

标签: colorsdrawingpaint

解决方案


推荐阅读