'android'에 해당되는 글 17건

  1. 2013.01.28 Android - ProgressBar를 이용한 Recorder 만들기 (녹음기) (2)
  2. 2012.02.29 Android - 간단한 메뉴버튼 옵션메뉴 생성하기
  3. 2012.02.17 Android - 단말기 번호 정보 알아내기 (4)
  4. 2012.02.10 Android - dip, dp < = > px 변환
  5. 2012.02.10 Android - TextView EditText 기초내용 (펌)

Android - ProgressBar를 이용한 Recorder 만들기 (녹음기)

Android 2013.01.28 17:47

 

안녕하세요 오랜만에 글을 쓰게되었습니다. 만 1년이 지나갔나요?

개발자로 일을 하다가 잠시 다른일에 허덕이다가 지금은 백수.......... 현재 다시 공부중입니다 하하 ㅡㅡ;;

 

개발쪽일은 취미로 할까 생각해요 ㅎ 저녁에 조금씩 java쪽을 공부하고 있네요 ㅎ

이제는 Android 뿐만 아니라 Web도 다루게 될 것 같습니다 !

 

다들 화이팅 하십시요 !

 

 

오늘은 프로그래스바를 이용한 녹음기를 만들어보겠습니다.

기초적인 것이구요 . 이것을 토대로 채팅에 필요한 음성메세지 구현을 했었습니다.

 

이 프로젝트를 응용하여 적용시키는 것은 여러분의 몫입니다 . 기초적인 프로그래스 이용 녹음기 설명 시작하겠습니다.

 

대부분 필요한 내용은 주석 처리로 설명을 대신하였구요 살펴볼 내용만 몇가지 집고 소스 첨부하겠습니다.

 

 

녹음기 말 그대로 말을 녹음한뒤에 다시 듣는 것이지요.

이것을 프로그래스바를 이용하여서 진행하는 정도와 듣기 시 내가 얼마나 들었는지를 표시하여 사용의 편함을 추가한 것이지요.

 

UI 변경을 위해서 Handler를 이용했습니다.

Handler가 아니면 동시에 UI를 변경할 수 없기에 백그라운드에서 돌리기 위함입니다. 하지만 다른 방법도 있겠지요?

 


 

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);

 

이부분 setOutputFormat은 파일이 생성될 때 포맷을 정해주는 역활을 합니다. 이것을 바꿔줌으로써 아이폰과 동시에 쓸 수 있게 포맷을 바꿔주던가 자신이 원하는 포맷으로 파일을 생성할 수 있습니다.

 

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

 

파일의 인코더를 어떤식으로 해줄 것인가를 정해주는 것입니다. DEFAULT 무난하게 !


mRecorder.setOutputFile(mFilePath + mFileName);

 

마지막으로 녹음이 되어지는 파일을 어떠한경로에 생성을 하느냐에 대한 문장이지요.

변수로 설정하였기에 mFilePath 파일 경로 / mFileName 파일 명 이 되겠습니다. 직접 적어주셔도되고 저처럼 한번 선언한 수 가져다가 쓰셔도 좋습니다. 후자가 편합니다.

 

 

그리구 중요한 한가지 uses-permission 부분입니다.

이 프로젝트에서 안드로이드폰에서 저장소와 오디오 부분을 사용하기 때문에 그 부분을 사용하기 위한 허락?을 받아야죠?

Permission에서 두가지를 설정해 주세요.

먼저 오디오를 사용하기 위해 android.permission.RECORD_AUDIO

저장소를 사용하기 위해 android.permission.WRITE_EXTERNAL_STORAGE 두가지를 설정하셔야 합니다.

 

 

제가 생각했던 부분은 이정도 이구요. 빠뜨린 부분이 있다면 주석으로 처리해두셔서 보기 어렵지 않으실거라 생각합니다.

 

 

앗! 그리고 프로젝트 생성이 바뀌었더군요 ㅎ

알아서 잘들 하실거라 생각합니다. 제가 설정한 몇가지만 적겠습니다.

 

 

 

프로젝트 생성

 

패키지 : com.jsh.examrecorder

클래스명 : ProgressRecorder

XML파일명 : main

타겟은 : 2.2 ~ 4.2

 

 

ProgressRecorder.java 

ProgressRecorder.txt

 

package com.example.com.jsh.examrecorder;


import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

public class ProgressRecorder extends Activity implements View.OnClickListener, OnCompletionListener
{

// 미리 상수 선언
  private static final int REC_STOP = 0;
  private static final int RECORDING = 1;
  private static final int PLAY_STOP = 0;
  private static final int PLAYING = 1;
  private static final int PLAY_PAUSE = 2;
 
  private MediaRecorder mRecorder = null;
  private MediaPlayer mPlayer = null;
  private int mRecState = REC_STOP;
  private int mPlayerState = PLAY_STOP;
  private SeekBar mRecProgressBar, mPlayProgressBar;
  private Button mBtnStartRec, mBtnStartPlay, mBtnStopPlay;
  private String mFilePath, mFileName = null;
  private TextView mTvPlayMaxPoint;
 
  private int mCurRecTimeMs = 0;
  private int mCurProgressTimeDisplay = 0;
 
  // 녹음시 SeekBar처리
  Handler mProgressHandler = new Handler()
  {
    public void handleMessage(Message msg)
    {
      mCurRecTimeMs = mCurRecTimeMs + 100;
      mCurProgressTimeDisplay = mCurProgressTimeDisplay + 100;
     
      // 녹음시간이 음수이면 정지버튼을 눌러 정지시켰음을 의미하므로
      // SeekBar는 그대로 정지시키고 레코더를 정지시킨다.
      if (mCurRecTimeMs < 0)
      {}
      // 녹음시간이 아직 최대녹음제한시간보다 작으면 녹음중이라는 의미이므로
      // SeekBar의 위치를 옮겨주고 0.1초 후에 다시 체크하도록 한다.
      else if (mCurRecTimeMs < 20000)
      {
        mRecProgressBar.setProgress(mCurProgressTimeDisplay);
        mProgressHandler.sendEmptyMessageDelayed(0, 100);
      }
      // 녹음시간이 최대 녹음제한 시간보다 크면 녹음을 정지 시킨다.
      else
      {
        mBtnStartRecOnClick();
      }
    }
  };
 
  // 재생시 SeekBar 처리
  Handler mProgressHandler2 = new Handler()
  {
    public void handleMessage(Message msg)
    {
      if (mPlayer == null) return;
     
      try
      {
        if (mPlayer.isPlaying())
        {
          mPlayProgressBar.setProgress(mPlayer.getCurrentPosition());
          mProgressHandler2.sendEmptyMessageDelayed(0, 100);
        }
      }
      catch (IllegalStateException e)
      {}
      catch (Exception e)
      {}
    }
  };
 
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
   
    // 미디어 레코더 저장할 파일 생성
    mFilePath = "/sdcard/Download/";
   
    // 파일명을 년도월일시간분초 로 생성 겹치는 상황 없애기
    SimpleDateFormat timeStampFormat = new SimpleDateFormat(
"yyyyMMddHHmmss");
   
    // 파일명 위에서 정한 파일명을 WJ 폴더에 저장
    mFileName = "/WJ"
+ timeStampFormat.format(new Date()).toString()
+ "Rec.mp4";
   
    mBtnStartRec = (Button) findViewById(R.id.btnStartRec);
    mBtnStartPlay = (Button) findViewById(R.id.btnStartPlay);
    mBtnStopPlay = (Button) findViewById(R.id.btnStopPlay);
    mRecProgressBar = (SeekBar) findViewById(R.id.recProgressBar);
    mPlayProgressBar = (SeekBar) findViewById(R.id.playProgressBar);
    mTvPlayMaxPoint = (TextView) findViewById(R.id.tvPlayMaxPoint);
   
    mBtnStartRec.setOnClickListener(this);
    mBtnStartPlay.setOnClickListener(this);
    mBtnStopPlay.setOnClickListener(this);
  }
 
  // 버튼의 OnClick 이벤트 리스너
  public void onClick(View v)
  {
    switch(v.getId())
    {
      case R.id.btnStartRec:
        mBtnStartRecOnClick();
        break;
      case R.id.btnStartPlay:
        mBtnStartPlayOnClick();
        break;
      case R.id.btnStopPlay:
        mBtnStopPlayOnClick();
        break;
      default:
        break;
    }
  }
 
  private void mBtnStartRecOnClick()
  {
    if (mRecState == REC_STOP)
    {
      mRecState = RECORDING;
      startRec();
      updateUI();
    }
    else if (mRecState == RECORDING)
    {
      mRecState = REC_STOP;
      stopRec();
      updateUI();
    }
  }
 
  // 녹음시작
  private void startRec()
  {
    mCurRecTimeMs = 0;
    mCurProgressTimeDisplay = 0;
   
    // SeekBar의 상태를 0.1초후 체크 시작
    mProgressHandler.sendEmptyMessageDelayed(0, 100);
   
    if (mRecorder == null)
    {
      mRecorder = new MediaRecorder();
      mRecorder.reset();
    }
    else
    {
      mRecorder.reset();
    }
   
    try
    {
   
    //오디오 파일 생성
      mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
      mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
      mRecorder.setOutputFile(mFilePath + mFileName);
      mRecorder.prepare();
      mRecorder.start();
    }
    catch (IllegalStateException e)
    {
      Toast.makeText(this, "IllegalStateException", 1).show();
    }
    catch (IOException e)
    {
      Toast.makeText(this, "IOException", 1).show();
    }
  }
 
  // 녹음정지
  private void stopRec()
  {
    try
    {
      mRecorder.stop();
    }
    catch(Exception e){
   
    }
    finally
    {
      mRecorder.release();
      mRecorder = null;
    }
   
    mCurRecTimeMs = -999;
    // SeekBar의 상태를 즉시 체크 
    mProgressHandler.sendEmptyMessageDelayed(0, 0);
  }
 
  private void mBtnStartPlayOnClick()
  {
    if (mPlayerState == PLAY_STOP)
    {
      mPlayerState = PLAYING;
      initMediaPlayer();
      startPlay();
      updateUI();
    }
    else if (mPlayerState == PLAYING)
    {
      mPlayerState = PLAY_PAUSE;
      pausePlay();
      updateUI();
    }
    else if (mPlayerState == PLAY_PAUSE)
    {
      mPlayerState = PLAYING;
      startPlay();
      updateUI();
    }
  }
  private void mBtnStopPlayOnClick()
  {
    if (mPlayerState == PLAYING || mPlayerState == PLAY_PAUSE)
    {
      mPlayerState = PLAY_STOP;
      stopPlay();
      releaseMediaPlayer();
      updateUI();     
    }
  }
 
  private void initMediaPlayer()
  {
    // 미디어 플레이어 생성
    if (mPlayer == null)
      mPlayer = new MediaPlayer();
    else
      mPlayer.reset();
   
    mPlayer.setOnCompletionListener(this);
    String fullFilePath = mFilePath + mFileName;
   
    try
    {
      mPlayer.setDataSource(fullFilePath);
      mPlayer.prepare();  
      int point = mPlayer.getDuration();
      mPlayProgressBar.setMax(point);
     
      int maxMinPoint = point / 1000 / 60;
      int maxSecPoint = (point / 1000) % 60;
      String maxMinPointStr = "";
      String maxSecPointStr = "";
     
      if (maxMinPoint < 10)
        maxMinPointStr = "0" + maxMinPoint + ":";
      else
        maxMinPointStr = maxMinPoint + ":";
     
      if (maxSecPoint < 10)
        maxSecPointStr = "0" + maxSecPoint;
      else
        maxSecPointStr = String.valueOf(maxSecPoint);
     
      mTvPlayMaxPoint.setText(maxMinPointStr + maxSecPointStr);
     
      mPlayProgressBar.setProgress(0);
    }
    catch(Exception e)
    {
      Log.v("ProgressRecorder", "미디어 플레이어 Prepare Error ==========> " + e);
    }
  }
 
  // 재생 시작
  private void startPlay()
  {
    Log.v("ProgressRecorder", "startPlay().....");
   
    try
    {
      mPlayer.start();
     
      // SeekBar의 상태를 0.1초마다 체크     
      mProgressHandler2.sendEmptyMessageDelayed(0, 100);
    }
    catch (Exception e)
    {
      e.printStackTrace();
      Toast.makeText(this, "error : " + e.getMessage(), 0).show();
    }
  }
 
  private void pausePlay()
  {
    Log.v("ProgressRecorder", "pausePlay().....");
   
    // 재생을 일시 정지하고
    mPlayer.pause();
   
    // 재생이 일시정지되면 즉시 SeekBar 메세지 핸들러를 호출한다.
    mProgressHandler2.sendEmptyMessageDelayed(0, 0);
  }
 
  private void stopPlay()
  {
    Log.v("ProgressRecorder", "stopPlay().....");
   
    // 재생을 중지하고
    mPlayer.stop();
   
    // 즉시 SeekBar 메세지 핸들러를 호출한다.
    mProgressHandler2.sendEmptyMessageDelayed(0, 0);
  }
 
  private void releaseMediaPlayer()
  {
    Log.v("ProgressRecorder", "releaseMediaPlayer().....");
    mPlayer.release();
    mPlayer = null;
    mPlayProgressBar.setProgress(0);
  }
 
  public void onCompletion(MediaPlayer mp)
  {
    mPlayerState = PLAY_STOP; // 재생이 종료됨

    // 재생이 종료되면 즉시 SeekBar 메세지 핸들러를 호출한다.
    mProgressHandler2.sendEmptyMessageDelayed(0, 0);
   
    updateUI();
  }
 
  private void updateUI()
  {
    if (mRecState == REC_STOP)
    {
      mBtnStartRec.setText("Rec");
      mRecProgressBar.setProgress(0);
    }
    else if (mRecState == RECORDING)
      mBtnStartRec.setText("Stop");
   
    if (mPlayerState == PLAY_STOP)
    {
      mBtnStartPlay.setText("Play");
      mPlayProgressBar.setProgress(0);
    }
    else if (mPlayerState == PLAYING)
      mBtnStartPlay.setText("Pause");
    else if (mPlayerState == PLAY_PAUSE)
      mBtnStartPlay.setText("Start");
  }
}

 

main.xml

 

 

 

 

 

main.txt

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#06000b" >
<!-- progress bar -->
<LinearLayout
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center_vertical|center_horizontal"
  android:background="@null">
  <SeekBar
   android:id="@+id/recProgressBar"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical|center_horizontal"
   android:max="60000"
   android:padding="10dp"
   android:progress="0"/>
 
  <RelativeLayout
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:gravity="center_vertical"
      android:orientation="vertical"
      android:background="@null">

   <TextView
    android:id="@+id/tvRecStartPoint"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|left"
    android:layout_alignParentLeft="true"
    android:textSize="12sp"
    android:textColor="#FFFFFF"
    android:text="00:00"
    />
   <TextView
    android:id="@+id/tvRecMaxPoint"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|right"
    android:layout_alignParentRight="true"
    android:textSize="12sp"
    android:textColor="#FFFFFF"
    android:text="00:20"
    />
  </RelativeLayout>
</LinearLayout>

<LinearLayout
  android:orientation="horizontal"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:gravity="center_vertical|center_horizontal"
  android:background="@null">
  <Button
      android:id="@+id/btnStartRec"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:textSize="14sp"
      android:text="Rec" />
</LinearLayout>


<!-- progress bar -->
<LinearLayout
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center_vertical|center_horizontal"
  android:background="@null">
  <SeekBar
   android:id="@+id/playProgressBar"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical|center_horizontal"
   android:max="60000"
   android:padding="10dp"
   android:progress="0"/>
 
  <RelativeLayout
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:gravity="center_vertical"
      android:orientation="vertical"
      android:background="@null">

   <TextView
    android:id="@+id/tvPlayStartPoint"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|left"
    android:layout_alignParentLeft="true"
    android:textSize="12sp"
    android:textColor="#FFFFFF"
    android:text="00:00"
    />
   <TextView
    android:id="@+id/tvPlayMaxPoint"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|right"
    android:layout_alignParentRight="true"
    android:textSize="12sp"
    android:textColor="#FFFFFF"
    android:text="01:00"
    />
  </RelativeLayout>
</LinearLayout>

<LinearLayout
  android:orientation="horizontal"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:gravity="center_vertical|center_horizontal"
  android:background="@null">
  <Button
      android:id="@+id/btnStartPlay"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:textSize="14sp"
      android:text="Play" />
  <Button
      android:id="@+id/btnStopPlay"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:textSize="14sp"
      android:text="Stop" />
</LinearLayout>
</LinearLayout>

 

 

실행결과

 

 

 

 

 

 

 

 

 

 

 

실행결과 화면이구요.

제가 개발 했을때 보다 환경이 바뀌었네요 ㅎㅎ

소리는 직접 하셔서 들어보셔요 !

문의는 댓글로 부탁드립니다.

저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comments 2
  1. HJ_Reden 2015.02.24 13:45 신고 Modify/Delete Reply

    안녕하세요~~ 코드 감사합니다!!
    궁금한게 있는데요ㅠㅠ
    녹음을 시작했는데 00:00은 왜 안올라가는걸까요?

  2. HJ_Reden 2015.02.24 13:45 신고 Modify/Delete Reply

    안녕하세요~~ 코드 감사합니다!!
    궁금한게 있는데요ㅠㅠ
    녹음을 시작했는데 00:00은 왜 안올라가는걸까요?

Write a comment


Android - 간단한 메뉴버튼 옵션메뉴 생성하기

Android 2012.02.29 15:02


한 액티비티에서 보이는 화면에 버튼을 추가하지 않고 메뉴버튼을 선택했을 때 나타나는 옵션메뉴를 간단하게 생성해 보겠습니다.

옵션메뉴를 생성하려고 하는 곳에서 다음과 같은 소스를 추가하여 자신이 원하는 대로 수정하시면 되겠습니다.

간단하게 2개의 옵션메뉴를 생성해보겠습니다.

소스는 다음과 같습니다.


@Override

public boolean onCreateOptionsMenu(Menu menu) {

menu.add(0, 0, 0, "홈").setIcon(android.R.drawable.ic_menu_revert);

menu.add(0, 1, 0, "새로고침").setIcon(android.R.drawable.ic_menu_rotate);

return true;

}


위 소스는 메뉴버튼을 생성할 때의 메소드입니다.
add 메소드는 메뉴를 추가할 때마다 써주는 것이구요 2개 생성이니깐 2개의 메소드를 썼습니다.
add메소드는 4개의 인자를 가지는데요  
menu.add(groupId, itemId, order, titleRes)

groupId 는 메뉴 아이템을 그룹지을 때 사용되고, 
itemId 는 아이템 식별을 위해 메뉴 아이템의 고유한 이름이 됩니다.
order 는 아이템 표시 순서를 지정하는데, 기본값으로는 추가된 순서대로 표시가 되고,
title 은 메뉴 아이템이 가지는 이름이며 , 구글 공식문서에서는 문자열 리소스로 작성하도록 권고하고 있네요 

그리고 뒤에 setIcon은 보시는데로 아이콘을 같이 뛰어주기 위해 사용합니다.
현재 제가 쓴 방법은 기본으로 안드로이드에서 제공하는 이미지를 사용한 것이구요 
사용자가 직접 만든 이미지를 사용할려면 R.drawable.이미지 가 되겠지요.


@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case 0:

 //처리할 이벤트

break;
 

case 1:

 // 처리할 이벤트 

break;

default:

break;

}

return super.onOptionsItemSelected(item);

}

이 소스는 옵션메뉴의 클릭 이벤트 처리 메소드 이구요
버튼처리처럼 메뉴의 아이템아이디 값을 받아와 처리합니다. 
add 메소드로 추가할 때 적는 itemId 값입니다.


 
이런식으로 하단 메뉴버튼을 누르면 밑에서 숨겨진옵션메뉴가 스르륵 올라옵니다.

간단하게 옵션메뉴 생성하는 방법을 살펴보았습니다.
도움이 되었으면 합니다. ~~~ 뿅 

 
저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

Write a comment


Android - 단말기 번호 정보 알아내기

Android 2012.02.17 14:23


소스를 짜다보면 사용 단말기의 번호가 필요한 경우가 있습니다.

인증이나 다른곳에 필요할 때 직접 입력하기보다는 단말기 번호를 자체적으로 하면 사용자입장에선 편할 것 같습니다.

아래는 간단하게 단말기 번호를 알아내서 000-0000-0000 이런식으로 바꿔주는 소스입니다.

if문은 간혹 단말기에 010이 아닌 +82 라던가 다른 번호로 시작할 경우를 대비해서 간단한 제어문을 한거지만

외국단말기 등 더 많은 처리를 해주어야겠지요.

소스는 아래와 같습니다.

TelephonyManager telManager = (TelephonyManager)getApplicationContext().getSystemService(getApplicationContext().TELEPHONY_SERVICE); 
 

String phoneNum = telManager.getLine1Number(); 

if(!phoneNum.substring(0, 3).equals("010")){
 


phonenumber = ("0" + phoneNum.substring(3, 5) + "-" +phoneNum.substring(5, 9) + "-" +phoneNum.substring(9));
 


}else {
 


phonenumber = (phoneNum.substring(0, 3) + "-" +phoneNum.substring(3, 7) + "-" +phoneNum.substring(7));
 


}




유용하게 쓰셨으면 좋겠습니다 ! 

문의는 댓글이나 방명록을 이용해주세요. 
저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comments 4
  1. estt____ 2012.02.27 20:50 신고 Modify/Delete Reply

    덕분에 좋은정보를 하나 얻어갑니다.

    그런데 phoneNum = ("0" + phoneNum.substring(3, 5) + "-" +phoneNum.substring(5, 9) + "-" +phoneNum.substring(9));
    이부분 에서 -는 000-0000-0000 에 이용되는건가요?
    그냥할경우는 00000000000 나오기때문에 마이너스 넣는법을 찾고잇어요.

    • estt____ 2012.02.27 21:01 신고 Modify/Delete

      잘못햇군요. 위에 비밀번호를 이상하게 쳐가지고 번호에 마이너스를 넣을려면 어떻게해야할까요?

    • 정승현 2012.02.29 14:47 신고 Modify/Delete

      현재 위에 방식이

      000-0000-0000

      방식입니다.

  2. eeaa3 2012.03.01 11:21 신고 Modify/Delete Reply

    위에를 못읽엇습니다. 방식이 적혀져잇네요 ㅎㅎ

Write a comment


Android - dip, dp < = > px 변환

Android 2012.02.10 15:09

개발 하시다 보면 기기마다 해상도때문에 크기를 따로 지정할때 가 있습니다.

하나의 dip값을 정해주면 단말기 해상도에 따라 px값으로 변경해주는 소스입니다.


int px = (int) TypedValue.applyDimension(

                TypedValue.COMPLEX_UNIT_DIP, [dp값], context.getResources().getDisplayMetrics());



 [dp값] 이부분에 원하는 dp값을 넣으시면 단말기별로 px값에 변환된 px값이 들어갑니다.




다음은 px 값을 dp값으로 변환 하는 소스입니다.


float
scale =
getContext().getResources().getDisplayMetrics().density;
int dp =   (int)([px값] / DEFAULT_HDIP_DENSITY_SCALE * scale); 

 [px값] 이부분에 원하는 px값을 넣으시면 단말기별로 dp값에 변환된 px값이 들어갑니다.

 

유용하게 쓰입니다 ㅎㅎ 
저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

Write a comment


Android - TextView EditText 기초내용 (펌)

Android 2012.02.10 13:31

텍스트뷰와 에디트텍스트를 사용하다보면 필요한 기초상식입니다.
좋은 내용이어서 퍼왔습니다 . 참고하세요.

텍스트 뷰 #1

 

1) 상속관계


 View - TextView - Button

                           - EditText


 

2) xml 속성들

 
 - EditText
 

 (EditText) 수평스크롤, 자동 개행

 default : 오른쪽 변에 닿으면 자동 개행

 scrollHorizontally = "T/F" : 오른쪽 변에 닿았을 때 수평 스크롤, Enter로 개행

 singleLine = "T/F" : 수평 스크롤, 개행 X


 (EditText) 입력 형식, 범위 제한

 digits = "유효 char들"    ex) digits = "aeiou"

 numeric = "integer"  : 아라비아 숫자만

               = "signed"  : 선두에만 - 부호 허용

               = "decimal"  : 소수점 허용

               = "decimal|signed"

 phoneNumber = "T/F" : -, (), 아라비아 숫자 허용

 password = "T/F" : 마지막으로 입력한 문자만 잠시 보여줌


 (EditText) 클릭시 전체 Focus 및 cursor 유무

 selectAllOnFocus = "T/F" : 선택되면 문자열 전체를 선택해준다.

 cursorVisible = "T/F" : 커서를 보여주기. 


(EditText) 대문자화

 capitalize = "characters" : 글자 모두 대문자화

                 = "words" : 단어의 첫글자만 대문자화

                 = "sentences" : 문장의 첫 글자만 대문자화


 (EditText) 내용 생략하기 및 marquee(자동 스크롤)

                                         -> 이 속성 적용이 되려면 반드시 singleLine 속성 지정

 ellipsize = "none" : 뒷부분 자르기

               = "start" : 첫부분 ...

               = "middle" : 중간 ...

               = "end" : 뒷부분 ...

               = "marquee" : 좌우로 스크롤하여 보여줌, focus를 가졌을 때에만 스크롤됨.

                                                                            따라서 focusable = "true" 되야 함.

 marqueeRepeatLimit = "integer" : 기본 3, integer값만큼 왕복

                                  = "marquee_forever" : 무한 반복


  (EditText) hint 주기

  hint = "string" : box에 글씨가 써 있고, focus를 가졌을 때 문자열이 사라짐

  textColorHint = "color" : hint의 color





 - TextView

 

 (TextView) 주소형식에 대한 자동 link 생성

 autoLink = "none" : 링크 지원 X

               = "email" : 이메일 주소

               = "map" : 지도의 주소

               = "web" : 웹 주소

               = "phone" : 전화번호 인식

               = "all" : 상기 패턴 모두

               = "phone|web"


(TextView) Shadow 주기 및 장평

 shadowColor = "Color" : shadow 색깔

 shadowDx = "float" : 그림자와 본 글자의 거리 X

 shadowDy = "float" : 그림자와 본 글자의 거리 Y

 shadowRadius = "float" : 그림자의 크기

 textScaleX = "float" : 높이에 대한 폭의 비율로 장평 조절  ex) 2 : 뚱뚱이,  0.4 : 날씬이


 (TextView) Text 줄간격

 lineSpacingMultiplier = "float" : 줄간격 1 기준

 lineSpacingExtra = "integer unit" : 줄간격 추가로 주기


 (TextView) 수평, 수직 줄수 조정

 lines = "integer" : 강제로 integer 값만큼 높이를 강제로 차지

 minLines = "integer"  : wrap_content 여야만 한다.

 maxLines = "integer" : wrap_content 여야만 한다.

 ems = "integer" : 수평 크기를 EM 크기 기준으로

 minEms = "integer"  : wrap_content 여야만 한다.

 maxEms = "integer" : wrap_content 여야만 한다.




펌 사이트 - http://schwein7.tistory.com/139

  
저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 1 : Comment 0

Write a comment