홈으로 홈으로 | 무료회원가입 | 아이디/비번찾기 | 즐겨찾기
추천음악방송메인홈1대1상담음악방송청취
뽕짝아가씨(무료음악채널)
okTrot(무료음악채널)
전통가요(무료음악채널)
음악가사 검색
온라이브스토어(앱다운로드)
온라이브(방송등록및청취)
비디오 베스트 50
금영노래방
TJ노래방
유튜브 동영상 다운로드
POP Player
신나는 고스톱
컴퓨터 오목
작은 음악다방
운.영.자.1대1.상담
FAQ\지원.프로그램
Q&A\고.객.지.원

자동러시 웹플레이어신청

보안∵서버∵쿠키
윈도우∵프레임
이미지∵배경
시간∵달력∵계산
상태바∵타이틀바
음악∵영상
폼∵전송∵테이블
키보드∵마우스
효과∵링크∵메뉴
Script∵php
기타
PHP 강좌
윈도우관련팁
웹관련팁
홈페이지제작팁
기본강좌
레지스트리
윈도우서버
리눅스서버
Android
[개발 Tip] 멀티터치 (Multi Touch) 구현 소스
2년 전
package kr.pe.miksnug;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;

/**
* 안드로이드 멀티터치 입니다.<br/>
* <br/>
* 프로젝트 실행 Main Activity 클래스 <br/>
* Android 2.0 이상 지원 <br/>
* <br/>
* 1. 멀티터치 감지 (구현상 무한대)<br/>
* 2. 터치점에 원형 표시<br/>
* 3. 누르는 힘에 따라 색깔 및 크기 변경<br/>
* 4. 누르는 힘에 따라 진동 변경<br/>
* <br/>
*
* @author yeongeon
*
*/
public class MainActivity extends Activity {

  /**
   * 메인 레이아웃 인스턴스
   */
  private FrameLayout m_mainLayout = null;

  /**
   * 디버그 텍스트 출력용 뷰
   */
  TextView m_tvDebugText = null;
  TextView m_tvDebugText2 = null;

  
  /**
   * 입력된 이벤트 수
   */
  private int m_eventCnt = 0;

  /**
   * 원 도형 View 클래스
   *
   * @author yeongeon
   */
  class Ball extends View {

    /**
     * X 좌표
     */
    public float m_x;

    /**
     * Y 좌표
     */
    public float m_y;

    /**
     * 반지름
     */
    private int m_r;

    /**
     * 페인트 인스턴스
     */
    private Paint m_paint = new Paint(Paint.LINEAR_TEXT_FLAG);

    /**
     * 원 도형 생성자
     *
     * @param context
     * @param x
     * @param y
     * @param r
     * @param color
     */
    public Ball(Context context, float x, float y, int r, int color) {
      super(context);
      m_paint.setColor(color);
      this.m_x = x;
      this.m_y = y;
      this.m_r = r;
    }

    /**
     * 도형 그리는 메소드
     *
     * @see android.view.View#onDraw(android.graphics.Canvas)
     */
    @Override
    protected void onDraw(Canvas canvas) {
      canvas.drawCircle(m_x, m_y, m_r, m_paint);
      super.onDraw(canvas);
    }

  }
  

  /**
   * MyText View 클래스
   *
   * @author yeongeon
   */
  class FloatingText extends View {

    /**
     * X 좌표
     */
    public float m_x;

    /**
     * Y 좌표
     */
    public float m_y;

    /**
     * 반지름
     */
    private String m_t;

    /**
     * 페인트 인스턴스
     */
    private Paint m_paint = new Paint(Paint.LINEAR_TEXT_FLAG);

    /**
     * 원 도형 생성자
     *
     * @param context
     * @param x
     * @param y
     * @param r
     * @param color
     */
    public FloatingText(Context context, float x, float y, String t, int color) {
      super(context);
      m_paint.setColor(color);
      this.m_x = x;
      this.m_y = y;
      this.m_t = t;
    }

    /**
     * 도형 그리는 메소드
     *
     * @see android.view.View#onDraw(android.graphics.Canvas)
     */
    @Override
    protected void onDraw(Canvas canvas) {
      canvas.drawText(m_t, m_x, m_y, m_paint);
      super.onDraw(canvas);
    }

  }

  /**
   * 터치 이벤트 개별 노드 클래스
   *
   * @author yeongeon
   */
  class EventNode {
    /**
     * 포인터 아이디
     */
    private int m_pointerId = -1;

    /**
     * 포인터 인덱스
     */
    private int m_pointerIndex = -1;

    /**
     * x 좌표 값
     */
    private float m_x = -1;

    /**
     * y 좌표 값
     */
    private float m_y = -1;

    /**
     * 압력 값
     */
    private float m_pressure = -1;

    /**
     * 도형 인스턴스
     */
    private Ball m_ball = null;

    /**
     * Paint 색
     */
    private int m_color = Color.YELLOW;
    
    /**
     * 진동 시간 간격
     */
    int m_vibrationInterval = 2;
    
    /**
     * 반지름
     */
    int m_radius = 50;
    
    /**
     * 떠다니는 문자 인스턴스
     */
    FloatingText m_floatingText = null;
    
    
    /**
     * 생성자 입니다.
     *
     * @param event
     * @param idx
     */
    public EventNode(MotionEvent event, int idx) {
      this.m_pointerId = event.getPointerId(idx);
      this.m_pointerIndex = event.findPointerIndex(this.m_pointerId);
      this.m_x = event.getX(this.m_pointerIndex);
      this.m_y = event.getY(this.m_pointerIndex);
      this.setPressure(event.getPressure(this.m_pointerIndex) );
      if (this.getPressure() >= 0.1 && this.getPressure() < 0.18) {
        this.m_color = Color.GREEN;
        this.m_vibrationInterval = 3;
        this.m_radius = 60;
      } else if (this.getPressure() > 0.25) {
        this.m_color = Color.RED;
        this.m_vibrationInterval = 6;
        this.m_radius = 100;
      } else if (this.getPressure() >= 0.18 && this.getPressure() < 0.25) {
        this.m_color = Color.BLUE;
        this.m_vibrationInterval = 4;
        this.m_radius = 70;
      } else {
        this.m_color = Color.YELLOW;
        this.m_vibrationInterval = 2;
        this.m_radius = 50;
      }
      this.m_ball = new Ball(getApplicationContext(), this.getX(), this
          .getY(), this.m_radius, this.getColor());
      
      this.m_floatingText = new FloatingText(getApplicationContext(), this.getX()-(this.m_radius/2), this
          .getY()-this.m_radius, ""+ this.getPressure(), Color.WHITE );      
      
    }
    
    public FloatingText getFloatingText(){
      return m_floatingText;
    }
    
    public int getVibrationInterval() {
      return this.m_vibrationInterval;
    }

    /**
     * 정의된 Paint 색 값을 반환하는 메소드입니다.
     *
     * @return
     */
    public int getColor() {
      return this.m_color;
    }

    /**
     * Paint 색을 할당하는 메소드입니다.
     *
     * @param color
     */
    public void setColor(int color) {
      this.m_color = color;
    }

    /**
     * 압력 값을 반환하는 메소드입니다.
     *
     * @return
     */
    public float getPressure() {
      return this.m_pressure;
    }

    /**
     * 압력 값을 정의하는 메소드입니다.
     *
     * @param pressure
     */
    public void setPressure(float pressure) {
      this.m_pressure = pressure;
    }

    /**
     * 포인터 아이디를 반환하는 메소드입니다.
     *
     * @return
     */
    public int getPointerId() {
      return this.m_pointerId;
    }

    /**
     * 포인터 인덱스를 반환하는 메소드입니다.
     *
     * @return
     */
    public int getPointerIndex() {
      return this.m_pointerIndex;
    }

    /**
     * x 좌표값을 반환하는 메소드입니다.
     *
     * @return
     */
    public float getX() {
      return this.m_x;
    }

    /**
     * y 좌표값을 반환하는 메소드입니다.
     *
     * @return
     */
    public float getY() {
      return this.m_y;
    }

    /**
     * 도형 인스턴스를 반환하는 메소드입니다.
     *
     * @return
     */
    public Ball getBall() {
      return this.m_ball;
    }

    /**
     * 각 인스턴스 값을 초기화하는 메소드입니다.
     */
    public void setInit() {
      this.m_pointerId = -1;
      this.m_pointerIndex = -1;
      this.m_x = -1;
      this.m_y = -1;
      this.m_pressure = -1;
      this.m_color = Color.GREEN;
      this.m_ball = null;
    }
  }

  /**
   * 모션 이벤트를 담아두는 ArrayList 인스턴스입니다.
   */
  private ArrayList<EventNode> m_aEventNodes = new ArrayList<EventNode>();

  /**
   * Activity 생성시 접근 메소드
   *
   * @see android.app.Activity#onCreate(android.os.Bundle)
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // 레이아웃 인스턴드 할당
    m_mainLayout = (FrameLayout) this.findViewById(R.id.main);

    // 디버그 텍스트 뷰 인스턴스 할당
    m_tvDebugText = (TextView) this.findViewById(R.id.debug_text);
    m_tvDebugText2 = (TextView) this.findViewById(R.id.debug_text2);
  }

  /**
   * 터치했을때 반응하는 메소드입니다.
   *
   * @see android.app.Activity#onTouchEvent(android.view.MotionEvent)
   */
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    m_eventCnt = event.getPointerCount();

    m_tvDebugText.setVisibility(View.VISIBLE);
    m_tvDebugText.setText("Points : " + m_eventCnt
        + " / EventNodes : " + m_aEventNodes.size());

    switch (event.getAction()) {
    // 눌렀을 때
    case MotionEvent.ACTION_DOWN:
      drawBall(event);
      return true;

      // 누르고 이동할 때
    case MotionEvent.ACTION_MOVE:
      moveBall(event);
      return true;

      // 떼었을 때
    case MotionEvent.ACTION_UP:
      removeBall();

      m_tvDebugText.setVisibility(View.GONE);
      return true;
    }

    return false;
  }

  /**
   * 도형 그리는 메소드
   *
   * @param event
   */
  private void drawBall(MotionEvent event) {
    removeBall();
    for (int i = 0; i < m_eventCnt; i++) {
      EventNode eventNode = new EventNode(event, i);
      m_aEventNodes.add(eventNode);
      m_mainLayout.addView(eventNode.getBall());
      m_mainLayout.addView(eventNode.getFloatingText());
      ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(eventNode.getVibrationInterval());
    }

  }

  /**
   * 도형 이동 처리 메소드
   *
   * @param event
   */
  private void moveBall(MotionEvent event) {
    removeBall();
    drawBall(event);
  }

  /**
   * 도형 제거 처리 메소드
   */
  private void removeBall() {
    int nSize = m_aEventNodes.size();
    for (int i = 0; i < nSize; i++) {
      m_mainLayout.removeView(m_aEventNodes.get(0).getBall());
      m_mainLayout.removeView(m_aEventNodes.get(0).getFloatingText());
      m_aEventNodes.remove(0);
    }
  }

}
추천추천 : 102 추천 목록
번호 제목
1,315
 포토샵 psd 파일 연결 레지스트리(registry) 편집
1,314
 윈도 10 최신 업데이트 후 인터넷 속도의 저하가 발생할 때 조치 사항
1,313
 Autotuning level 해제 (윈도우비스타 이상 윈도우)인터넷 속도 빠르게 하는 방법
1,312
 윈도우에서 특정프로세스를 일괄 종료하는법
1,311
 MediaPlayer 클래스 사용법
1,310
 안드로이드에서 audio player 실행하기
1,309
 [Android] MediaPlayer 음악재생기 만들기
1,308
 Eclipse와 Android NDK 연동하기
1,307
 Android Sliding Drawer Functionality 안드로이드 슬라이딩 드로우 예제 sample
1,306
 Android Speech To Text
1,305
 Android WebPageLoader with progress-bar
1,304
 Android Text To Speech(TTS)
1,303
 Android Playing Audio from a web url
1,302
 Button height different from background height in Android image design
1,301
 Android Getting Started with Material Design
1,300
 Using toast inside timertask perfect
1,299
 네트워크 상태 [Android]
1,298
 Webview source [Android]
1,297
 공유 Intent [Android]
1,296
 intent uri 모음 [Android]
1,295
 http requestWebViewClient [Android]
1,294
 캐시 삭제
1,293
 캐시 지우기 [Android]
1,292
 바로풀어(수학 문제 질의응답 SNS) 에 사용된 오픈소스 라이브러리 [Android]
1,291
 Webviw [Android]
1,290
 오픈소스 라이브러리 모음 [Android]
1,289
 Android webview 개발시 알아둬야 할 것들 [Android]
1,288
 webview 동영상 재생 [Android]
1,287
 [Android] Webview 404 에러 처리
1,286
 [Android] webview ssl 문제
1,285
 [Android] Webview url 숨기기
1,284
 [Android] AlarmManager 일정시간 이벤트 실행
1,283
 안드로이드 오픈소스 끝판
1,282
 android studio DefaultHttpClient, HttpClient import 에러
1,281
 [Android] Webview 메소드
목록
인기절정뽕짝파티
트로트재생목록
인기트로트모음
지루박디스코메들리
밤무대애창곡
전자올겐경음악
종합성인가요방
못잊을옛날노래
카바레 음악
트롯디스코팡팡
관광 메들리
트롯카페
가요감상실
추억의옛노래
스페셜가요광장
BillBoard Free
추천가요모음
경음악.전자올겐
스페셜음악여행
WOLRD POPs
K-POP\BillBoard
JP\CN
POP TOP BEST
K.R.노래방

추천가요\인기
F뮤직 인기\발라드
F뮤직 애창\트로트
트로트성인가요
인기가요
프리미엄 POP
경음악\기타
프리미엄 최신가요
프리미엄 성인가요
가요1번지(종합)
뮤직하우스
동요\연변\반주\기타
가요축제\트롯1번지
댄스\메들리\리믹스
카페\명상\경음악\기타
뮤직트로트 부산광역시부산진구 가야동 ㅣ 개인정보취급방침
Copyright (C) musictrot All rights reserved.