ctivity에서는
iv = (ImageView)findViewById(R,id.imageView);
iv.setImageBitmap(BitmapFactory.decodeFile(file, bfo))
이렇게 하면 imageView에 잘 나타나는데,
제가 Custom View에서 여러장의 이미지를 읽어와서, Custom View 내에서 canvas에 그리지 않고
대략 아래와 같이 구성을 해서 ImageView로 나타내고 싶은데, 잘 안되서 꼭 좀 조언을 부탁드립니다.
public class TestView extends View {
private ImageView iv1, iv2, vi3, iv4, iv5;
public TesttView(Context context) {
this(context, null);
}
public TesttView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setImageView(){
iv1 = new ImageView(getContext());
iv2 = new ImageView(getContext());
iv3 = new ImageView(getContext());
iv4 = new ImageView(getContext());
iv5 = new ImageView(getContext());
iv1.setLayoutParams(new LayoutParams(480, 800));
iv2.setLayoutParams(new LayoutParams(480, 800));
iv3.setLayoutParams(new LayoutParams(480, 800));
iv4.setLayoutParams(new LayoutParams(480, 800));
iv5.setLayoutParams(new LayoutParams(480, 800));
}
public void showImage(String filePath){
Bitmap cur_bm = BitmapFactory.decodeFile(filePath);
float imageWidth = (float)cur_bm.getWidth();
float imageHeight = (float)cur_bm.getHeight();
float newHeight = imageHeight / (imageWidth / screenWidth);
float newWidth = screenWidth;
scaleWidth = screenWidth / imageWidth;
scaleHeight = newHeight / imageHeight;
iv1.setImageBitmap(cur_bm);
Matrix mtrx = new Matrix();
mtrx.postScale(scaleWidth, scaleHeight);
iv1.setImageMatrix(mtrx);
iv1.setScaleType(ScaleType.MATRIX);
iv1.invalidate();
}
}
위와 같이 ImageView를 만들어서, 이미지를 넣고, Matrix를 이용해서 invalidate()를 했는데,
화면에 아무것도 나오지 않습니다. 디버그를 찍어보면 이미지뷰도 생성이 잘 되었고,
이미지도 잘 들어갔는데...
onDraw 없이 ImageView를 그릴 수 는 없는 건가요?
꼭꼭 조언을 좀 부탁드리겠습니다.
너무 답답하고 조급해서 조언을 구합니다.
복 받으세요.
감사합니다.
소중한 의견 감사드립니다.
음... 제가 이걸 하려는 의도는, 여러장의 이미지를 스크롤 시키거나,(iv1~iv5)가 연이어서 웹툰이 스크롤 되는 것처럼 보여지거나,
iv1, iv2가 겹쳐서 보이게 하면서, 손으로 밀면 iv1이 접히면서 iv2가 보이는,,, 책장을 넘기는 것처럼 보인다고나 할까 하는 기능을 만들고 싶어서 입니다.
iv1~iv5까지.. (이걸 배열로 만들 수도 있겠지만)에 Matrix를 이용해서 크기와 위치를 정해줘서
연속적으로 스크롤되게 하거나 확대 또는 넘기는 효과와 같이 ImageView컨트롤을 하고 싶은데,
일단, new ImageView()로 이미지뷰가 생성되고 이미지도 들어가는 것 같은데, 화면에 뿌려지게 하는 방법을 몰라서
밤새 고생을 했고 지금도 하고 있습니다. 좋은 조언...꼭 좀 부탁드리겠습니다.
감사합니다.
꾸벅~
이거 더 깊은 늪으로 이끄는건 아닌지 모르겠지만....
ViewFlipper 라는 widget 이 있습니다.
이녀석은 뷰를 교체하면서 중간에 필요한 작업(애니메이션을 넣는다던지....)을 대신 해주는 녀석입니다.
그 외에 비슷한 녀석이라면 Gallary widget 이 있겠네요.
아무튼 제가 필요했던것은 플리퍼와는 다르게 ACTION_MOVE 가 왼쪽, 오른쪽 왔다갔다 하면 실시간으로 화면도 왔다갔다하는...
그런게 필요해서 말씀하신 것과 비슷하게 matrix를 이용해 dispatchDraw() 에서 직접 그렸습니다.
베이스 클래스는 RelativeLayout을 상속받아서 내부에 뷰를 3개 가지고...
Prev View <-> Current View <-> Next View
위와 같이 왔다갔다 하게 했었습니다.
흐름은 bitmap manager 가 쓰레드를 가지고 일련의 이미지들을 미리 쭈욱~ 로딩 해놓고...
제가 만든 커스텀 Layout 녀석이 필요한(커런트, 이전, 이후 이렇게 3장) 이미지를 bitmap manager 에게서 가져와서...
최초엔 current 이미지를 화면 중앙에 뿌리고,
ACTION_DOWN 에서 down 좌표를 기억해서...
ACTION_MOVE 에서는 deltaX(이동한 거리)를 구해 해당 값만큼 prev, current, next를 이동해서 그렸었습니다.
마지막으로 ACTION_UP과 ACTION_CANCEL 에서는 deltaX값을 보고 그 크기가 양수이면 next로 넘어가는 애니메이션을,
음수이면 prev로 넘어가는 애니메이션을 start 시키고,
draw 할때 animation이 있으면 animation으로 부터 matrix를 구해 각 뷰에 적용해서 그리는....
(말로 설명하니 많이 난잡하네요^^;)
아무튼 그런식이였습니다.
소스는 사정이 있어 오픈하긴 좀 곤란하네요(사실 부끄러워 그렇습니다 ㅎㅎ;;)
아무튼 참조하실만한 샘플이라고 한다면 ViewFlipper나 ViewSwitcher 소스를 한번 보시면 어떨까 싶네요.
그럼 즐거운하루되세요~
그것을 꼭 해야하는 건가요? 해야한다면 어느부분에서 어떤식으로 해줘야하는지 꼭 좀 알려주시면 감사하겠습니다.
감사합니다.
제가 Activity를 아래와 같이 만들어서, 위와 같은 구조의 TestView를 라이브러리 처럼 사용하고 싶어서 그렇습니다.
file_Path에는 여러장의 이미지가 들어있는 어떤 파일이라고 가정을 하고 이것을 넘겨주면
TestView에서 이미지들을 스크롤되게 하거나 넘기는 효과등과 같이 보여지게 하려는 의도입니다.
public class TestViewerSampleActivity extends Activity {
private TestView tv;
setContentView(R.layout.my_view);
tv = (TestView)findViewById(R.id.testView);
tv.openFile(file_path);
//이하 tv에 이미지이동과 같은 기타의 메써드를 만들어서 App에서 컨트롤
}
참고로 my_view XML은
<?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"
>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0"
>
<com.android.viewer.TestView android:id="@+id/testView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0"
android:background="#FFFFFFFF"
/>
<LinearLayout
android:id="@+id/overlay"
android:background="#AFFFFFFF"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="20dp"
>
<Button
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Prev"
android:onClick="onBtnPrev"
/>
<Button
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Next"
android:onClick="onBtnNext"
/>
<Button
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="연속"
android:onClick="onBtnStrait"
/>
<Button
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="이동"
android:onClick="onBtnMove"
/>
<Button
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="thum"
android:onClick="onBtnThumb"
/>
<ImageView
android:id="@+id/image_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
</FrameLayout>
</LinearLayout>
이런식으로 만들었습니다.
소중한 의견 기다리겠습니다.
감사합니다.




안녕하세요. android 초보 비앱니다 ^^;
올리신 글을 좀 읽어봤는데요...
일단 TestView 가 내부적으로 ImageView 들(iv1~iv5)을 가지고 있는 것 까지는 알겠는데요...
혹시 올리지 않으신 부분에 해당 뷰(iv1~iv5)들 중 하나를 set 하는 부분이 있는지요?
set이라 함은 addView 혹은 setContentView 등을 호출하는 것을 말하는건데요....
이러한 set 하는 부분이 없다면 화면에 표시되지 않고 메모리상에서만 존재하는 뷰가 될것 같습니다 ^^;;;
연장해서 조금 더 말씀드리자면 TestView 는 View 를 상속받아 사용하고 있는데요...
의도하시는바가 어떤 방식인지는 모르지만....
동적으로 iv1~iv5 를 교체하며 보여주길 원하신다면 그냥 View 가 아니라 ViewGroup 이나 Layout 씨리즈(Linear, Relative 등...)
들을 상속받아 필요한 시점에 addView(iv1) 뭐 이런식으로 사용하는 것이 어떨까 싶네요^^;;
부족한 실력이나마 몇자 적어봤습니다
실제 테스트해보지 못하고 글 적는점 양해 부탁드립니다
즐거운하루되세요~