Programming Language/Android Programming

Application 제작

D4tai1 2018. 11. 26.

※ 특정인물에 대한 소개를 할 수 있는 Application 제작을 하려고 한다.

주로 하는 분야가 아니라 부족하지만 간단한 기능을 하는 앱정도는 만들어 볼 수 있을 것 같다.


1. Application 소개

  ▶ 특정인물은 음악가 베토벤을 지정하였고 그를 소개하고 성장과정에 대한 지식을 전달하려고 한다.

  ▶ 베토벤의 사진을 볼 수 있다.

  ▶ 베토벤의 명곡 리스트를 확인할 수 있다.

  ▶ 베토벤의 음악을 재생할 수 있다.


2. 시연

 [1] 메인화면

  ▶ 소개, 성장, PLAY, 음악이름을 가진 4개의 button, 1개의 imageView, 1개의 seekBaractivity_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

댓글