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 |
댓글