Android 불규칙 이미지 색상 채 우기 게임

개술
최근 에 단체 에서 한 친구 가 단체 에서 불규칙 한 이미 지 를 채 우 는 것 을 우연히 보 았 는데 그 자체 가 배 우 는 것 을 좋아 하고 실 용적 인 태도 로 관련 자 료 를 찾 아 보 았 다.이런 착색 자료 에 대해 가장 좋 은 것 은 관련 app 을 검색 하 는 것 입 니 다.제 관찰 에 따 르 면 불규칙 한 이미 지 는 착색 게임 에 채 워 넣 는 것 이 많 지만 대체적으로 두 가지 로 나 눌 수 있 습 니 다.
층 기반 충전
경계 기반 채 우기
그러면 상기 두 가지 에 대해 우 리 는 두 편의 박문 을 통 해 설명 할 것 이다.본 편 은 바로 층 을 바탕 으로 하 는 충전 방식 을 서술 하 는 것 이다.그러면 층 을 바탕 으로 하 는 충전 방식 은 무엇 입 니까?사실은 한 장의 그림 은 실제 적 으로 여러 층 으로 구 성 된 것 으로 각 층 은 일부 이미지(이미지 가 없 는 부분 은 투명)를 표시 하고 다 층 으로 중첩 한 후에 완전한 도안 을 형성 하 며 그림 층 간 은 중첩 되 는 관계 로 다음 그림 과 유사 하 다.

PS 를 배 웠 다 면 더 이상 알 수 없 을 것 이 라 고 믿 습 니 다.예 를 들 어 하늘 을 그 리 려 면 맨 밑 에 푸 른 하늘 을 그 릴 수 있 고 윗 층 에 흰 구름 을 그 릴 수 있 으 며 윗 층 에 작은 새 를 그 릴 수 있다.그리고 3 층 이 겹 쳐 지면 작은 새 한 마리 가 하늘 을 날 고 있 는 그림 이다.
2.효과 와 분석
자,이제 오늘 의 효 과 를 보 겠 습 니 다.

ok,간단 한 착색 효 과 를 볼 수 있 습 니 다.사실은 원리 가 간단 합 니 다.우선,이 그림 은 실제 적 으로 7 층 으로 구성 되 어 있 습 니 다.
예 를 들 어 다음 그림.

만약 우리 가 이 그림 의 어느 위치 에 착색 을 해 야 한다 면,실제로는 한 층 의 불투명 한 구역 에 착색 을 해 야 한다.실제로
사용자 가 클릭 한(x,y)->어느 층 에 떨 어 진 불투명 영역 을 판단 합 니 다->그리고 이 층 의 불투명 영역 에 착색 합 니 다.
ok,이러한 원 리 는 명확 하 게 서술 할 수 있 습 니 다.사실은 매우 간단 합 니 다.이 원 리 를 바탕 으로 우 리 는 View 를 사용자 정의 한 다음 에 그림 을 그 릴 수 있 습 니 다.마지막 으로 상기 절차 에 따라 코드 를 작성 할 수 있 습 니 다.그러나 우 리 는 게 으 름 을 피 울 수 있 는 곳 이 있 습 니 다.사실은 우리 가 한 층 의 그림 을 그 릴 필요 가 없습니다.우 리 는 Drawable 을 이용 하여 그림 의 중첩 작업 을 완성 할 수 있 습 니 다.우 리 는 Drawable 을 Layer Drawable 이 라 고 부 릅 니 다.해당 하 는 xml 는 layer-list 입 니 다.우 리 는 사용 을 통 해 우리 의 업 무 를 크게 간소화 할 수 있 습 니 다.
3.인 코딩 과 실현
상술 한 것 은 이미 명확 하 게 묘사 되 었 으 니,제 가 다시 여러분 께 세분 화 해 드 리 겠 습 니 다.
1.layer-list 에서 우리 의 drawable 을 정의 합 니 다.
2.그리고 이 drawable 을 우리 View 의 배경 으로 합 니 다.
3.onTouchEvent 방법 복사 하기;
4.사용자 가 클릭 한 좌표 가 어느 층 의 불투명 한 위치 에 있 는 지 판단 하고 이 층 의 불투명 한 영역 색상 을 변경 합 니 다.
(1)layer-list

 <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:drawable="@drawable/eel_mask1"/>
 <item
  android:drawable="@drawable/eel_mask2"/>
 <item
  android:drawable="@drawable/eel_mask3"/>
 <item
  android:drawable="@drawable/eel_mask4"/>
 <item
  android:drawable="@drawable/eel_mask5"/>
 <item
  android:drawable="@drawable/eel_mask6"/>
 <item
  android:drawable="@drawable/eel_mask7"/>
</layer-list>
ok,그러면 우리 drawable 은 ok~~말 안 했 지만 layer-list 는 많은 일 을 할 수 있 으 니 지 켜 보 세 요.
(2)보기 코드

package com.zhy.colour_app_01;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import java.util.Random;

/**
 * Created by zhy on 15/5/14.
 */
public class ColourImageBaseLayerView extends View
{
 private LayerDrawable mDrawables;

 public ColourImageBaseLayerView(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  mDrawables = (LayerDrawable) getBackground();
 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
 {
  setMeasuredDimension(mDrawables.getIntrinsicWidth(), mDrawables.getIntrinsicHeight());
 }
 @Override
 public boolean onTouchEvent(MotionEvent event)
 {
  final float x = event.getX();
  final float y = event.getY();
  if (event.getAction() == MotionEvent.ACTION_DOWN)
  {
   Drawable drawable = findDrawable(x, y);
   if (drawable != null)
    drawable.setColorFilter(randomColor(), PorterDuff.Mode.SRC_IN);
  }
  return super.onTouchEvent(event);
 }
 private int randomColor()
 {
  Random random = new Random();
  int color = Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256));
  return color;
 }
 private Drawable findDrawable(float x, float y)
 {
  final int numberOfLayers = mDrawables.getNumberOfLayers();
  Drawable drawable = null;
  Bitmap bitmap = null;
  for (int i = numberOfLayers - 1; i >= 0; i--)
  {
   drawable = mDrawables.getDrawable(i);
   bitmap = ((BitmapDrawable) drawable).getBitmap();
   try
   {
    int pixel = bitmap.getPixel((int) x, (int) y);
    if (pixel == Color.TRANSPARENT)
    {
     continue;
    }
   } catch (Exception e)
   {
    continue;
   }
   return drawable;
  }
  return null;
 }
}

ok,코드 도 간단 합 니 다.먼저 drawable 을 view 의 배경 으로 한 다음 에 구조 에서 drawable(Layer Drawable)을 가 져 옵 니 다.다음 에 onTouchEvent 를 복사 하고 사용자 가 클릭 한(x,y)을 캡 처 합 니 다.(x,y)에 따라 현재 클릭 한 층 이 어느 층 인지 찾 습 니 다.(비 투명 영역 에서 클릭 해 야 합 니 다)마지막 으로 setColorFilter 설정 을 통 해 색상 을 바 꾸 면 됩 니 다.easy 죠?마지막 으로 레이아웃 파일 을 붙 입 니 다.
(3)레이아웃 파일

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

 <com.zhy.colour_app_01.ColourImageBaseLayerView
  android:background="@drawable/eel"
  android:layout_width="match_parent"
  android:layout_centerInParent="true"
  android:layout_height="match_parent"/>

</RelativeLayout>
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기