colors - 带手指路径的着色书
问题描述
我对这一切都很陌生,我正在为孩子们创建一个应用程序,其中包括一个着色书类别。老实说,我发现了我不太明白的着色书的以下代码。但我面临一个问题,即此代码在点击时填写。这意味着绘图的单击部分会被选定的颜色填充。但我的想法是通过移动手指来为图片着色(就像绘画但有颜色)但老实说我不知道该怎么做。
这是代码
图画书课
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();
}
}
请原谅我糟糕的英语。任何帮助或支持将不胜感激。
提前致谢
解决方案
推荐阅读
- c# - CLR 存储过程无法连接 SqlConnection 常规连接
- hyperlink - Word 2016 邮件与超链接合并正在将合并字段更改为第一个超链接
- r - 关于传递给 R 中的数学函数的非数字参数的错误
- keras - 为什么 to_categorical 为 0 等于 [1,] 而不是 [1,0]?
- .net-core - Azure Pipelines 托管代理尚不支持 .Net Core 3.1?获取 NETSDK1045
- c# - 使用 JQuery Post 将列表项发送到 ASP.NET 控制器
- r - 使用 GLM 从逻辑回归模型中获取均值和标准差
- c - 如何查找目录的链接数
- python-3.x - 如何传递多个 kwargs
- python - 如何从 GeometryArray 或 LineString 中提取坐标?