Application 제작
※ 특정인물에 대한 소개를 할 수 있는 Application 제작을 하려고 한다.
주로 하는 분야가 아니라 부족하지만 간단한 기능을 하는 앱정도는 만들어 볼 수 있을 것 같다.
1. Application 소개
▶ 특정인물은 음악가 베토벤을 지정하였고 그를 소개하고 성장과정에 대한 지식을 전달하려고 한다.
▶ 베토벤의 사진을 볼 수 있다.
▶ 베토벤의 명곡 리스트를 확인할 수 있다.
▶ 베토벤의 음악을 재생할 수 있다.
2. 시연
[1] 메인화면
▶ “소개, 성장, PLAY, 음악“이름을 가진 4개의 button, 1개의 imageView, 1개의 seekBar가 activity_main.xml에 있다.
[2] 소개버튼 클릭
▶ 먼저 [소개]버튼을 클릭한다.
[3] 다이얼로그1 확인
▶ 타이틀 옆에 하트모양 사진을 추가하였다.
▶ title과 내용을 다이얼로그로 확인할 수 있다.
[4] 성장버튼 클릭
▶ 이어서 [성장] 버튼을 클릭한다.
[5] 다이얼로그2 확인
▶ title과 내용을 다이얼로그로 확인할 수 있다.
▶ message( )를 사용하지 않고 새로운 xml에서 글자색을 변경하였다.
[6] 메뉴 클릭 후 작곡이미지 라디오 선택
▶ [메뉴]에서 [작곡이미지] 라디오를 선택한다.
[7] 변경된 이미지 확인
▶ imageView의 그림이 작곡중인 이미지로 변경된 것을 확인할 수 있다.
[8] 메뉴 클릭 후 정면이미지 라디오 선택
▶ [메뉴]에서 [작곡이미지] 라디오를 선택한다.
[9] 변경된 이미지 확인
▶ imageView의 그림이 정면 이미지로 변경된 것을 확인할 수 있다.
[10] 음악버튼 클릭
▶ [음악] 버튼을 클릭한다.
[11] 명곡리스트 확인
▶ 새로운 화면에서 명곡리스트를 확인하고 [뒤로가기] 버튼을 클릭한다.
▶ 배경화면의 투명도가 높아졌다.
[12] PLAY 버튼 클릭
▶ [PLAY] 버튼을 클릭한다.
[13] 음악듣기
▶ 음악이 재생되는 것을 확인할 수 있다.
▶ 재생중일 경우 버튼이름이 [PAUSE]로 변경되고 버튼의 색이 [붉은색]으로 변경되어 음악을 일시정지 할 수 있는 상태가 된다.
▶ 음악이 나오고 있는 위치는 seekBar에서 확인할 수 있다.
▶ 음악의 총 길이를 seekBar의 최댓값에 적용했으며 음악이 재생중이면 sleep (1000)을 사용하여 1초에 1번씩 이동하도록 설정되어 있다.
▶ 잠시 일시정지를 위해 [PAUSE] 버튼을 클릭한다.
[14] 일시정지 상태확인
▶ 일시정지중일 경우 버튼이름이 [REPLAY]로 변경되고 버튼의 색이 [연두색]으로 변경되어 일시정지를 해제 할 수 있는 상태가 된다.
▶ [REPLAY] 버튼 클릭 시 일시정지 이후부터 다시 음악이 재생된다.
▶ 동시에 현재 재생중인 음악의 위치를 가져와 seekBar 에 적용한다.
[15] seekBar 이동
▶ setOnSeekarChangeListener()를 사용하여 사용자가 seekBar를 움직이면 재생위치를 바꿔준다.
▶ setLooping(true)로 설정하여 반복옵션을 추가하였다.
▶ [음악] 버튼을 눌러 화면을 이동한 경우에도 음악은 멈추지 않고 재생되도록 설정되어 있다.
3. 소스확인
[1] MainActivity.java
package com.example.d4tai1.project; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.media.MediaPlayer; import android.net.Uri; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; public class MainActivity extends AppCompatActivity { TextView dlg1_title, dlg1_content, dlg2_content; Button btnIntro, btnGrow, btnMusic, test; View dlgView1, dlgView2, dlgView3; ImageView imageView1; MediaPlayer mp; SeekBar seekBar1; Button btnWeb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnWeb = (Button)findViewById(R.id.btnWeb); test = (Button) findViewById(R.id.test); //dlg1_title = (TextView)findViewById(R.id.dlg1_titie); dlg1_content = (TextView) findViewById(R.id.dlg1_content); btnIntro = (Button) findViewById(R.id.btnIntro); btnGrow = (Button) findViewById(R.id.btnGrow); btnMusic = (Button) findViewById(R.id.btnMusic); imageView1 = (ImageView) findViewById(R.id.imageView1); seekBar1 = (SeekBar)findViewById(R.id.seekBar1); //imageView.setImageResource(R.drawable.image22); mp = MediaPlayer.create(this, R.raw.virus); mp.setLooping(true); //mp.setLooping(true); //mp.start(); btnWeb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse("http://ccurity.tistory.com/200"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }); test.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mp != null) { //IsPlaying(); playClicked(v); } else { //mp = MediaPlayer.create(MainActivity.this, R.raw.virus); //IsPlaying(); playClicked(v); } } /* private void IsPlaying() { if (!mp.isPlaying()) { //mp.start(); test.setText("pause"); } else { test.setText("replay"); mp.pause(); //mp.release(); //mp = null; } } */ }); btnIntro.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dlgView1 = View.inflate(MainActivity.this, R.layout.dialog1, null); //가지고 들어온다.(가지고 들어올 곳, 이 뷰에 가지고 들어올 xml파일, 뷰그룹) AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this); dlg.setView(dlgView1); //String title = dlg1_title.getText().toString(); //String content = dlg1_content.getText().toString(); dlg.setIcon(R.drawable.heart); dlg.setTitle("베토벤, 그는 누구인가..?"); //dlg.setMessage("루드위히 판 베토벤, 1770년 12월 17일 ~ 1827년 3월 26일)은 독일의 서양 고전 음악 작곡가이다. 독일의 본에서 태어났으며, 성인이 된 이후 거의 오스트리아 빈에서 살았다. 감기와 폐렴으로 인한 합병증으로 투병하다가 57세로 생을 마친 그는 고전주의와 낭만주의의 전환기에 활동한 주요 음악가이며, 작곡가로 널리 존경받고 있다. \"음악의 성인\" 또는 \"악성\"이라는 별칭으로 부르기도 한다. "); dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dlg.show(); } }); btnGrow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dlgView2 = View.inflate(MainActivity.this, R.layout.dialog2, null); AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this); dlg.setView(dlgView2); dlg.setIcon(R.drawable.heart); dlg.setTitle("고전음악의 최고 작곡가인 베토벤."); dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dlg.show(); } }); btnMusic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getApplicationContext(), SecondActivity.class); startActivityForResult(intent, 0); } }); @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater mInflater = getMenuInflater(); mInflater.inflate(R.menu.menu,menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.first: imageView1.setImageResource(R.drawable.image11); return true; //정상적으로 실행되었음을 반환 case R.id.second: imageView1.setImageResource(R.drawable.image33); return true; //정상적으로 실행되었음을 반환 } return super.onOptionsItemSelected(item); } public void playClicked(View v) { seekBar1.setMax(mp.getDuration()); // 음악의 총 길이를 시크바 최대값에 적용 seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(fromUser) // 사용자가 시크바를 움직이면 mp.seekTo(progress); // 재생위치를 바꿔준다(움직인 곳에서의 음악재생) } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); if (!mp.isPlaying()) { mp.start(); test.setText("pause"); test.setBackgroundColor(0xFFFF4444); } else { test.setText("replay"); mp.pause(); test.setBackgroundColor(0xFF00FF66); //mp.release(); //mp = null; } new Thread(new Runnable(){ // 쓰레드 생성 @Override public void run() { while(mp.isPlaying()){ // 음악이 실행중일때 계속 돌아가게 함 try{ Thread.sleep(1000); // 1초마다 시크바 움직이게 함 } catch(Exception e){ e.printStackTrace(); } // 현재 재생중인 위치를 가져와 시크바에 적용 seekBar1.setProgress(mp.getCurrentPosition()); } } }).start(); } }
[2] SecondActivity.java
package com.example.d4tai1.project; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class SecondActivity extends Activity { Button btnBack; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); btnBack = (Button)findViewById(R.id.btnBack); btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = getIntent(); setResult(RESULT_OK, intent); finish(); } }); } }
'Programming Language > Android Programming' 카테고리의 다른 글
일기장 제작 (0) | 2018.11.05 |
---|---|
내장메모리 접근 (0) | 2018.11.05 |
대화상자[입력] (0) | 2018.10.27 |
대화상자[라디오] (0) | 2018.10.27 |
메세지 띄우기 (0) | 2018.10.09 |
댓글