모바일
11-2. 갤러리 & 스피너
동로시
2021. 2. 25. 12:21
* Gallery
사진이나 이미지를 배치하고 좌우로 스크롤해서 볼 수 있다.
프로젝트1: 영화 포스터 보기
Gallery - 영화 포스터 40개
ImageView 1 - 클릭한 영화 포스터
<activity_main.xml>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:padding="5dp"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Gallery
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/gallery"
android:spacing="5dp"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mainPoster"
android:padding="20dp"/>
</LinearLayout>
<toast.xml>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ffff00"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:padding="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_foreground"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:id="@+id/textView"
android:text="영화 제목"/>
<ImageView
android:padding="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_foreground"/>
</LinearLayout>
<MainActivity.java>
package com.example.project11_1;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("갤러리 영화 포스터");
Gallery gallery = (Gallery)findViewById(R.id.gallery);
MyGalleryAdapter adapter = new MyGalleryAdapter(this);
gallery.setAdapter(adapter);
}
public class MyGalleryAdapter extends BaseAdapter{
Context context;
Integer[] posterId = {R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4,
R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8, R.drawable.image9,
R.drawable.image10, R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4,
R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8, R.drawable.image9,
R.drawable.image10, R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4,
R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8, R.drawable.image9,
R.drawable.image10, R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4,
R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8, R.drawable.image9,
R.drawable.image10};
String[] mvName = {"뷰티인사이드", "라라랜드", "호두까기 인형과 4개의 왕국", "토이스토리4", "말레피센트", "소울", "겨울왕국2",
"히말라야", "스윙키즈", "베이비 드라이버", "뷰티인사이드", "라라랜드", "호두까기 인형과 4개의 왕국", "토이스토리4", "말레피센트", "소울", "겨울왕국2",
"히말라야", "스윙키즈", "베이비 드라이버", "뷰티인사이드", "라라랜드", "호두까기 인형과 4개의 왕국", "토이스토리4", "말레피센트", "소울", "겨울왕국2",
"히말라야", "스윙키즈", "베이비 드라이버", "뷰티인사이드", "라라랜드", "호두까기 인형과 4개의 왕국", "토이스토리4", "말레피센트", "소울", "겨울왕국2",
"히말라야", "스윙키즈", "베이비 드라이버"};
MyGalleryAdapter(Context context){
this.context = context;
}
@Override
public int getCount() {
return posterId.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(context);
imageView.setLayoutParams(new Gallery.LayoutParams(200, 300));
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(5,5,5,5);
imageView.setImageResource(posterId[position]);
final int pos = position;
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView ivPoster = (ImageView)findViewById(R.id.mainPoster);
ivPoster.setScaleType(ImageView.ScaleType.FIT_CENTER);
ivPoster.setImageResource(posterId[pos]);
Toast toast = new Toast(context);
View toastView = (View)View.inflate(context, R.layout.toast, null);
TextView textView = (TextView)toastView.findViewById(R.id.textView);
textView.setText(mvName[pos]);
toast.setView(toastView);
toast.show();
return false;
}
});
return imageView;
}
}
}
* Spinner
PC의 드롭다운 박스와 비슷한 기능으로, 여러 개 중 하나를 선택할 수 있도록 화면을 확장하는 용도로 사용된다.
<activity_main.xml>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:padding="5dp"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/spinner"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:id="@+id/imageView"/>
</LinearLayout>
<MainActivity.java>
package com.example.project11_1;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("스피너");
final Integer[] posterId = {R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4,
R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8, R.drawable.image9,
R.drawable.image10};
final String[] movie = {"뷰티인사이드", "라라랜드", "호두까기 인형과 4개의 왕국", "토이스토리4", "말레피센트", "소울", "겨울왕국2",
"히말라야", "스윙키즈", "베이비 드라이버"};
Spinner spinner = (Spinner)findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, movie);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
ImageView imageView = (ImageView)findViewById(R.id.imageView);
imageView.setImageResource(posterId[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
프로젝트3: 프로젝트2 수정
ImageView 대신 Bitmap 으로 그리기
컨텍스트 메뉴 - 회전, 확대, 축소, 기울기 증가, 기울기 감소
<MainActivity.java>
package com.example.project11_1;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Integer[] posterId = {R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4,
R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8, R.drawable.image9,
R.drawable.image10};
MyGraphicView graphicView;
static float scaleX = 1, scaleY = 1, angle = 0, skew = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("스피너");
final String[] movie = {"뷰티인사이드", "라라랜드", "호두까기 인형과 4개의 왕국", "토이스토리4", "말레피센트", "소울", "겨울왕국2",
"히말라야", "스윙키즈", "베이비 드라이버"};
Spinner spinner = (Spinner)findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, movie);
spinner.setAdapter(adapter);
LinearLayout layout = (LinearLayout)findViewById(R.id.layout1);
graphicView = new MyGraphicView(this);
layout.addView(graphicView);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
graphicView.setPosition(position);
graphicView.invalidate();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
registerForContextMenu(graphicView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0,1,0,"회전");
menu.add(0,2,0,"확대");
menu.add(0,3,0,"축소");
menu.add(0,4,0,"기울기 증가");
menu.add(0,5,0,"기울기 감소");
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case 1:
angle += 45;
break;
case 2:
scaleX += 0.2f;
scaleY += 0.2f;
break;
case 3:
scaleX -= 0.2f;
scaleY -= 0.2f;
break;
case 4:
skew += 0.3f;
break;
case 5:
skew -= 0.3f;
break;
}
graphicView.invalidate();
return true;
}
public class MyGraphicView extends View{
int position;
public MyGraphicView(Context context){
super(context);
}
public void setPosition(int position){
this.position = position;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Bitmap picture = BitmapFactory.decodeResource(getResources(), posterId[position]);
int cenX = this.getWidth()/2;
int cenY = this.getHeight()/2;
int picX = (this.getWidth() - picture.getWidth())/2;
int picY = (this.getHeight() - picture.getHeight())/2;
canvas.rotate(angle, cenX, cenY);
canvas.scale(scaleX, scaleY, cenX, cenY);
canvas.skew(skew, skew);
canvas.drawBitmap(picture, picX, picY, null);
picture.recycle();
}
}
}