안 드 로 이 드 간단하게 그래 픽 기능 구현

어떻게 그림 에 그림 을 그립 니까?여기 데모 라 고 써 있어 요.참고 하 세 요.
1.공사 구 조 를 먼저 살 펴 본다.
공정 구조:

사용자 정의 view
이 사용자 정의 view 는 궤적 을 유지 하 는 기능 을 실 현 했 습 니 다.코드 는 다음 과 같 습 니 다.

package picturegame.view; 
 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
import com.winton.picturegame.R; 
 
public class GameView extends View{ 
   
  private Paint paint = null; // 
   
  private Bitmap originalBitmap = null;//    
   
  private Bitmap new1Bitmap = null; 
   
  private Bitmap new2Bitmap = null; 
   
  private float clickX =0; 
   
  private float clickY=0; 
   
  private float startX=0; 
   
  private float startY=0; 
   
  private boolean isMove = true; 
   
  private boolean isClear = false; 
   
  private int color =Color.RED;//          
   
  private float strokeWidth =2.0f;//       
   
   
 
  public GameView(Context context) { 
    this(context,null); 
    // TODO Auto-generated constructor stub 
  } 
  public GameView(Context context,AttributeSet atts) { 
    this(context,atts,0); 
    // TODO Auto-generated constructor stub 
  } 
  public GameView(Context context,AttributeSet atts,int defStyle) { 
    super(context,atts,defStyle); 
    // TODO Auto-generated constructor stub 
     
    originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.default_pic).copy(Bitmap.Config.ARGB_8888, true);//       
    new1Bitmap=originalBitmap.createBitmap(originalBitmap); 
  } 
 
  //     
  public void clear(){ 
    isClear =true; 
    new2Bitmap=originalBitmap.createBitmap(originalBitmap); 
    invalidate();//   
  } 
   
  public void setStrokeWidth(float width){ 
    this.strokeWidth=width; 
    initPaint(); 
  } 
  @Override 
  protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.onDraw(canvas); 
    canvas.drawBitmap(writer(new1Bitmap),0,0, null); 
     
  } 
   
  @Override 
  public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 
     
     
    clickX =event.getX(); 
     
    clickY=event.getY(); 
     
    if(event.getAction()==MotionEvent.ACTION_DOWN){ 
      isMove =false; 
      invalidate(); 
      return true; 
    } 
    else if(event.getAction()==MotionEvent.ACTION_MOVE){ 
      isMove =true; 
      invalidate(); 
      return true; 
    } 
     
     
    return super.onTouchEvent(event); 
  } 
   
  /** 
  * @Title: writer 
  * @Description: TODO(  bitmap) 
  * @param @param pic 
  * @param @return       
  * @return Bitmap       
  * @throws 
  */ 
  public Bitmap writer(Bitmap pic){ 
    initPaint(); 
     
    Canvas canvas =null; 
    if(isClear){ 
      canvas=new Canvas(new2Bitmap); 
    }else{ 
      canvas=new Canvas(pic); 
    } 
     
    if(isMove){ 
      canvas.drawLine(startX, startY, clickX, clickY, paint);//   
    } 
    startX = clickX; 
     
    startY =clickY; 
    if(isClear){ 
      return new2Bitmap; 
    } 
    return pic; 
  } 
   
  private void initPaint(){ 
     
    paint = new Paint();//     
     
    paint.setStyle(Style.STROKE);//      
     
    paint.setAntiAlias(true);//          
     
    paint.setColor(color);//       
     
    paint.setStrokeWidth(strokeWidth);//          
  } 
   
  /** 
  * @Title: setColor 
  * @Description: TODO(           ) 
  * @param @param color       
  * @return void       
  * @throws 
  */ 
  public void setColor(int color){ 
     
    this.color=color; 
    initPaint(); 
  } 
   
   
} 
3.홈 페이지 레이아웃 파일
홈 페이지 레이아웃 파일

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:gravity="center_horizontal" 
  android:orientation="vertical" > 
   
  <LinearLayout  
    android:layout_width="match_parent" 
    android:layout_height="50dp"  
    android:orientation="horizontal"    
    > 
    <LinearLayout  
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      > 
      <TextView  
        android:id="@+id/tv_30" 
        android:layout_width="30dp" 
        android:layout_height="30dp" 
        android:background="@drawable/bg_notifaction" 
        /> 
    </LinearLayout> 
     
   <LinearLayout  
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      > 
      <TextView  
        android:id="@+id/tv_25" 
        android:layout_width="25dp" 
        android:layout_height="25dp" 
        android:background="@drawable/bg_notifaction" 
        /> 
    </LinearLayout> 
     
    <LinearLayout  
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      > 
      <TextView  
        android:id="@+id/tv_20" 
        android:layout_width="20dp" 
        android:layout_height="20dp" 
        android:background="@drawable/bg_notifaction" 
        /> 
    </LinearLayout> 
     
    <LinearLayout  
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      > 
      <TextView  
        android:id="@+id/tv_15" 
        android:layout_width="15dp" 
        android:layout_height="15dp" 
        android:background="@drawable/bg_notifaction" 
        /> 
    </LinearLayout> 
     
     <LinearLayout  
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      > 
      <TextView  
        android:id="@+id/tv_10" 
        android:layout_width="10dp" 
        android:layout_height="10dp" 
        android:background="@drawable/bg_notifaction" 
        /> 
    </LinearLayout> 
    <LinearLayout  
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      > 
      <TextView  
        android:id="@+id/tv_5" 
        android:layout_width="5dp" 
        android:layout_height="5dp" 
        android:background="@drawable/bg_notifaction" 
        /> 
    </LinearLayout> 
     
     <LinearLayout  
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      > 
      <TextView  
        android:id="@+id/tv_2" 
        android:layout_width="2dp" 
        android:layout_height="2dp" 
        android:background="@drawable/bg_notifaction" 
        /> 
    </LinearLayout> 
  </LinearLayout> 
   
  <picturegame.view.GameView  
    android:layout_width="match_parent" 
    android:layout_height="300dp" 
    android:id="@+id/gameview" 
    /> 
   
       
   
  <Button  
    android:layout_width="200dp" 
    android:layout_height="80dp" 
    android:text="clear" 
    android:textColor="@color/black" 
    android:id="@+id/btn_clear" 
     
    /> 
 
</LinearLayout> 
4.주 활동 코드

package com.winton.picturegame; 
 
import picturegame.view.GameView; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
 
import com.winton.basemodule.BaseActivity; 
 
public class MainActivity extends BaseActivity implements OnClickListener { 
 
  private GameView gameview = null; 
  private Button clear = null; 
   
  private TextView tv30,tv25,tv20,tv15,tv10,tv5,tv2; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
  } 
 
  @Override 
  public void initView() { 
    // TODO Auto-generated method stub 
    setContentView(R.layout.activity_main); 
     
    gameview=(GameView)findViewById(R.id.gameview); 
    clear =(Button)findViewById(R.id.btn_clear); 
    tv30=(TextView)findViewById(R.id.tv_30); 
    tv25=(TextView)findViewById(R.id.tv_25); 
    tv20=(TextView)findViewById(R.id.tv_20); 
    tv15=(TextView)findViewById(R.id.tv_15); 
    tv10=(TextView)findViewById(R.id.tv_10); 
    tv5=(TextView)findViewById(R.id.tv_5); 
    tv2=(TextView)findViewById(R.id.tv_2); 
  } 
 
  @Override 
  public void initListener() { 
    // TODO Auto-generated method stub 
    clear.setOnClickListener(this); 
    tv30.setOnClickListener(this); 
    tv25.setOnClickListener(this); 
    tv20.setOnClickListener(this); 
    tv15.setOnClickListener(this); 
    tv10.setOnClickListener(this); 
    tv5.setOnClickListener(this); 
    tv2.setOnClickListener(this); 
     
  } 
 
  @Override 
  public void initData() { 
    // TODO Auto-generated method stub 
     
  } 
  @Override 
  public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(v==clear){ 
      gameview.clear(); 
      return; 
    } 
    if(v==tv30){ 
      gameview.setStrokeWidth(30f); 
      return; 
    } 
    if(v==tv25){ 
      gameview.setStrokeWidth(25f); 
      return; 
    } 
    if(v==tv20){ 
      gameview.setStrokeWidth(20f); 
      return; 
    } 
    if(v==tv15){ 
      gameview.setStrokeWidth(15f); 
      return; 
    } 
    if(v==tv10){ 
      gameview.setStrokeWidth(10f); 
      return; 
    } 
    if(v==tv5){ 
      gameview.setStrokeWidth(5f); 
      return; 
    } 
    if(v==tv2){ 
      gameview.setStrokeWidth(2f); 
      return; 
    } 
     
  } 
    
} 
효과
실행 효과 그림 은 다음 과 같 습 니 다.

의문
선 이 굵 어 지면 위의 그림 과 같은 불 연속 적 인 문제 가 발생 할 수 있다.고수 님,이거 어떻게 처리 하나 요?나 는 알고리즘 을 실행 해 야 한다 고 추측 하지만,어떻게 실행 해 야 할 지 아직 모른다.
글 은 여기까지 소개 해 드 리 겠 습 니 다.사실 많은 지식 도 잘 모 르 겠 습 니 다.여러분 들 이 보충 적 으로 확장 하고 공동으로 발전 하 시 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기