ListView에 버튼을 넣으려면 커스터마이징을 해야한다. BaseAdapter를 상속받아 Adapter를 커스텀하고

아래와 같이 이벤트 리스너를 등록을하면 버튼은 작동을 하지만 리스트가 클릭이 되지 않는 문제가 생긴다.


ListView.setOnItemClickListener()

ListView.setOnItemLongClickListener()


구글링 결과 커스텀 리스트에 버튼이 들어있을경우 모든 이벤트를 버튼이 흡수해버린다.
ImageButton으로 되어있는걸 ImageView로 변경하고 ImageView에 android:clickable="true" 옵션을 주니
이벤트 리스너가 정상작동한다.








커스텀 리스트뷰를 만들어 적용 후 데이터를 넣고 스크롤을 했더니 아이템 위치가 변경되는 현상이 발견.

생성한 Adapter의 getView에 홀더를 추가하여 데이터 변형을 방지 하였다.


@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		final int pos = position;
		
		CustomViewHolder holder;

		if ( convertView == null ) {
			.. 생략
			final TextView textview = (TextView)convertView.findViewById(R.id.custom_word_text);
			textview.setText( m_List.get(pos).getWord() );

			ImageButton btn = (ImageButton) convertView.findViewById(R.id.custom_word_listen);

			holder = new CustomViewHolder();
			holder.m_TextView	= textview;
			holder.m_ImgBtn		= btn;
			
			convertView.setTag(holder);
		}
		else {
			holder = (CustomViewHolder) convertView.getTag();
		}

		if ( m_List.get(pos).isVisibleWord() ) {
			holder.m_TextView.setText(m_List.get(pos).getWord());
		}
		else
			holder.m_TextView.setText(m_List.get(pos).getMeaning());
			
		return convertView;
	}
	
	public class CustomViewHolder {
		public TextView		m_TextView;
		public ImageButton	m_ImgBtn;
	}







Jni를 사용할때 Java를 거치지 않고 Asset파일에 접근 할 수 있다.

먼저 Java에서 Context.getAssets();을 사용하여 AssetManager를 보내준다.

	private static native void nativeCreated(AssetManager asset);

jni.c

#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
AAssetManager	*mgr;

void Java_pe_berabue_ex_GLView_nativeCreated(JNIEnv * env, jclass cls, jobject assetManager)
{
	char *buf;
	int fileSize;

	mgr = AAssetManager_fromJava(GetEnv(), assetManager);

	AAsset* asset = AAssetManager_open(mgr, "tmp.txt", AASSET_MODE_UNKNOWN);	// Asset 폴더안에 tmp.txt가 존재하면

	if ( asset == NULL )
		return;
	
	fileSize = AAsset_getLength(asset);
	
	if ( fileSize == 0 )
		return;
	
	buf = (char *)malloc(sizeof(char)*fileSize);
	AAsset_read(asset, buf, fileSize);
	
	AAsset_close(asset);
}

최소한의 소스만 적어보자면 위와 같다.

헤더파일을 포함시키고 Java에서 받아온 assetManager를 사용하면 된다.


android:minSdkVersion 9 이상 사용가능






다운로드 하기

 http://www.mantisbt.org/download.php 다운 받을 파일의 URL을 복사

 # wget 해당URL

 # tar xvzf 다운로드 받은 파일

 위 명령어를 이용하여 다운로드 및 압축을 해제한다.


설치하기 (웹 폴더안에 mantis를 만들어 압축을 해제해 놓음)

 http://도메인/mantis/admin/install.php 접속

 기본 정보 입력(기본 세팅에 DB비밀번호만 입력함) 후 install/Upgrade Database 버튼 클릭


 스크롤을 쭈욱 내리다 보면

 Write Configuration File(s)

 위 부분에 에러가 났다면

 # cp config_inc.php.sample config_inc.php 명령어를 사용하여 파일 복사

 # vi config_inc.php

 파일을 열어서 웹사이트에 나와있는


$g_hostname = 'localhost';

$g_db_type = 'mysql';

$g_database_name = 'bugtracker';

$g_db_username = 'root';

$g_db_password = '블라블라';


이 부분을 복사하여 붙여넣기, 바로 아래 이메일 부분에 적당히 적어준다.

한글을 사용하기위해 적당한 곳에 $g_default_language = "korean"; 입력 후 저장


웹페이지를 새로고침하면 해당 오류가 사라진다.


도메인/mantis 접속 시 로그인 페이지로 전환된다.



admin 폴더 삭제

 # rm -dfr admin/

 설치 완료 후 위 명령어를 사용하여 admin 폴더를 제거한다.



administrator 비밀번호 변경

 계정 administrator 비밀번호 root로 로그인을 하고 비밀번호를 변경한다.



설치 끝!






'도메인/폴더'와 같은 방법으로 루트폴더를 직접 입력하여 접근할때


index 기본 문서 파일이 없다면 index of 페이지에 모든 폴더 및 파일이 출력된다.


해당 페이지 출력 시 보안상 문제가 될 수 있으므로 아래와 같은 방법으로 접근을 차단한다.


#vi /etc/httpd/conf/httpd.conf


해당 파일에서 Options Indexes FollowSymLinks를 찾아 주석처리 한다.


#service httpd restart


아파치를 재시작하고 다시 접속해 보면 index of 페이지가 출력되지 않는다.





service mysqld start 명령 실행 시 아래와 같은 문구가 출력되면 해결방법.


another mysql daemon already running with the same unix socket


# service mysqld stop

# mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

# service mysqld start





웹페이지 시작 위치가 기본적으로 설정되어 있는 경로는 /var/www/html 이다.


해당 경로를 사용자가 원하는 경로로 변경이 가능하다.


vi /etc/httpd/conf/httpd.conf


DocumentRoot "/var/www/html" -> 원하는 경로로 변경

<Directory "/var/www/html"> -> 위와 똑같은 경로로 변경


저장 후 아파치 재시작


/etc/init.d/httpd restart





웹 페이지 시작 위치를 변경하고 아파치를 재시작할때 나타나는 에러


chcon -R -h -t httpd_sys_content_t /경로





웹에서 파일 다운로드 시 You don't have permission to access / on this server. 오류가 출력되면


해당 파일이 존재하는 폴더를 아래와 같이 명령어에 넣는다.


restorecon -rv /경로





public class ListManager {
	
	// 객체
	private ArrayList

m_ArrList; private ArrayAdapter m_Adapter; private EditText m_EditText; private Button m_BtnAdd; private ListView m_ListView; public ListManager() { Activity activity = MainActivity.m_Activity; Context context = MainActivity.m_Context; m_EditText = (EditText) activity.findViewById(R.id.page2_edittext); m_BtnAdd = (Button) activity.findViewById(R.id.page2_btn_add); m_ListView = (ListView) activity.findViewById(R.id.page2_listview); m_ArrList = new ArrayList(); // 텍스트 입력 후 아이템 추가 m_BtnAdd.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if ( m_EditText.getText().toString().equals("") ) { return; } m_ArrList.add(m_EditText.getText().toString()); m_EditText.setText(""); m_Adapter.notifyDataSetChanged(); } }); m_Adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, m_ArrList); // 어댑터 연결 m_ListView.setAdapter(m_Adapter); } }


메인 액티비티에서 리스트 뷰 사용시 ListActivity를 상속 받아야 하는데 그 외 클래스에서 리스트뷰를 관리 하려면

이와 같은 방법을 사용하면 된다.

xml에 설정 된 EditText, Button, ListView를 연결 해준다.

텍스트 하나만 들어갈 경우 Adapter 생성 시 android.R.layout.simple_list_item_1을 넣어준다.


xml




    
        
	    
	    
	    






사용 목적은 리눅스 공부 및 장난감으로 저전력, 저소음, 저 예산, 확장성을 기준으로 만들기로 하였다.


부품 스펙

 메인보드GA-B75N 제이씨현120,7801  
 파워SF-500P14PE GOLDEN KING130,0001 
 CPU 방열판LP5336,9601 
케이스ELITE 13066,5001 


위 파워는 단종되어 같은모델 600으로 구매.

CPU는 국내에 저전력 CPU가 출시가 안되는 관계로 타오바오에서 1610T를 구입하여 배송대행을 이용해 구했다. (배송비 포함 7만원 정도)

기존에 사용하던 하드디스크를 사용하려고 했는데 파티션 분할이 안되어 WD20EZRX 2TB 구입. (배송비 포함 9.5)


처음 예산 20 ~ 25의 두배에 달하는 50사용... (모니터, 키보드, 마우스는 남는것 사용. 램은 기존 메인컴에서 하나(4G) 추출)



앞으로 해보고 싶은 것

1. MP3 스트리밍 서버

2. SVN

3. FTP 서버

4. 원격으로 켜고 끄기

5. 안드로이드 앱으로 PC 제어

6. 홈페이지 서버

7. 보안

8. 게임 서버

9. 토렌트




error: Qt Creator needs a compiler set up to build. Configure a compiler in the kit options.


QT를 설치하고 새 프로젝트를 만들어 빌드를 하였더니 위와같은 에러가 발생.


Build ->Open Build and Run Kit Selector 를 선택하면 kit 과 build를 선택 할 수 있는 창이 뜬다.


Desktop QT 5.1.1 MSVC 2010 32bit 를 Desktop Qt 5.1.1 MinGW 32bit 로 변경 후 빌드 ~ 정상작동 확인.
 




'QT' 카테고리의 다른 글

QT 설치하기  (0) 2013.09.08
[ Qt ] QTreeWidget 만들기  (0) 2012.10.02
[ Qt ] 프로그램 배포시 에러 ( 프로시저 시작 지점 ... )  (0) 2012.10.02
[ Qt ] 로그 출력 ( print console )  (0) 2012.10.01
[ Qt ] 시그널 / 슬롯  (0) 2012.10.01



QT 설치하기

Window 환경에서 설치하는 방법.


위 사이트에 접속하여 원하는 버전을 다운받는다.
여기서는 5.1 버전을 다운 받았다.

다운받은 파일을 실행시켜 그대로 설치하면 끝.

설치 중간 라이센스 확인, 하위 버전 설치여부 등 선택을 할 수 있다.

 







C 사용시

void Java_com_berabue_test_GLView_nativeDrawFrame()
{
	LOGI("onDrawFrame");
}


C++ 사용시  


extern "C"
{
	JNIEXPORT void JNICALL Java_com_berabue_test_GLView_nativeDrawFrame()
	{
		LOGI("onDrawFrame");
	}
}





JNI를 사용해서 C, C++ 코드를 사용 할 떄 각 코드별로 다르게 코딩해주어야 한다.


C 사용시
JNIEnv *GetEnv()
{
	JNIEnv *env = NULL;

	(*g_vm)->GetEnv(g_vm, (void **)&env, JNI_VERSION_1_4);
	if ( env == NULL )
	{
		(*g_vm)->AttachCurrentThread(g_vm, (JNIEnv **)&env, NULL);
	}

	return env;
}

jclass getJClass(JNIEnv *env)
{
	return (*env)->FindClass(env, "com/berabue/test/GLView");
}

C++ 사용시
JNIEnv *GetEnv()
{
	JNIEnv *env = NULL;

	g_vm->GetEnv((void **)&env, JNI_VERSION_1_4);
	if ( env == NULL )
	{
		g_vm->AttachCurrentThread((JNIEnv **)&env, NULL);
	}

	return env;
}

jclass getJMainClass(JNIEnv *env)
{
	return env->FindClass("com/berabue/test/GLView");
}






1. 멀티 플랫폼으로 사용 가능하도록 설계하기. ( 라이브러리가 하나로 사용되거나, 분리되어도 문제 없도록 )


2. 플랫폼에 종속 된 기능은 되도록 사용하지 않기. ( 멀티 플랫폼을 위해서 )


3. 툴과 연동 되도록 하기.


4. 네이티브 액티비티 (?)


5. 자바 + 네이티브 (?)


6. 자바 (?)


우선, 안드로이드 엔진 부터 만들도록 한다.

처음에는 4번 방법으로 제작을 하려고 했는데, 인앱이나 다른 라이브러리(광고, 통계 등등)와 호환성이 떨어질 것으로 판단되고 6번 방법은 보완에도 취약하고 속도면에서 부족하다는 생각에  5번 방법으로 제작 예정.

 


13. 08. 11 - 이미지 및 스프라이트 동작 테스트 완료. (추후 디자인 패턴을 사용하여 엔진 변경하기)



쓰레드 간단 사용법

private Thread m_Thread; public Main() { m_Thread = new Thread(new ThreadStart(update)); m_Thread.Start(); } private void update() { while(true) { if ( m_NodeAni == null ) { m_Thread.Suspend(); } QbTagAnimation tagAni = (QbTagAnimation) m_NodeAni.Tag; QbTagFrame tag = (QbTagFrame) tagAni.getFrame(num); m_PictureBox.paintFrame(tag); m_PictureBox.paintPreviewFrame(tag); if ( tagAni.getCount() <= ++num ) num = 0; Thread.Sleep(1000 / m_nFPS); } }

Thread 객체를 생성하고 주기적으로 업데이트 될 함수(위 소스에서는 update)를 지정하여 Thread를 생성한다.


사용중인 Thread를 잠시 멈추고 싶을때는 m_Thread.Suspend();를 사용하고


멈추어 있는 Thread를 다시 작동 시키기 위해서는 m_Thread.Resume();를 사용한다.


위 소스는 m_NodeAni 객체가 null일때 Thread 동작을 멈추게 되어있다.




 






먼저, 해당 툴에서 사용되는 Resource란 무엇을 뜻하는지 설명하겠다. (Resource는 제가 마음대로 정한 명칭)

해당 툴과 연동할 엔진을 OpenGL로 제작을 할 예정이다.




옆 이미지를 보면 168*140 px 짜리 파란 이미지가 있다. 이 이미지를 OpenGL에서 출력 하려면

2의 제곱수로 만들어야 한다. 그렇다면 168, 140보다 큰 2의 제곱수는 256 이므로 256 * 256 크기의

비트맵(검은색 영역)안에 파란색 이미지를 넣어서 파란 부분만 부분적으로 그려 주어야 한다.


이미지 하나 하나 마다 해당 과정을 거치면 빈 공간의 메모리와 해당작업을 하는데 소요되는 시간을

잃게되어 큰 비트맵안에 여러개의 이미지를 넣어서 비트맵 한장을 로딩한 후 필요한 영역의 이미지만

그려주는 방식을 사용하기 위해서 Resource를 만드는 것이다.












불러오기 : 추출한 리소스를 불러온다.

리소스 생성 : 2의 제곱수의 비트맵 하나를 생성한다.

리소스 추출 : 선택 된 리소스 하나를 별도로 저장한다.

이미지 추가 : 리소스에 이미지를 추가 한다.

삭제 : 선택된 객체(이미지, 리소스)를 제거 한다.

이미지 정렬 : 리소스안의 이미지가 빈 공간이 없이 최적의 위치를 찾을 수 있도록 정렬한다.











'이미지 탭'과 별개로 동작하는 스프라이트 만들기.

하나의 스프라이트는 애니메이션, 프레임, 레이어로 이루어짐






추가 된 기능

 - 스프라이트 추가 및 삭제

 - 리스트 이름 변경

 - 선택 된 이미지 영역 처리

 - 입력장치로 이미지 위치 이동

 - 단축키 추가

 - 전체 데이터 저장 및 불러오기

 - (2013. 07. 01) 코드 재설계

 - (2013. 07. 01) 해상도 설정 및 설정 저장

 - (2013. 07. 01) 그리드 추가 및 간격 설정

 - (2013. 07. 01) 미리보기

 - (2013. 07. 03) 미리보기 업데이트 - 프레임 선택 시 하위 레이어 모두 미리보기

 - (2013. 07. 03) 좌표 지정, 중심축, 반전 기능

 - (2013. 07. 04) 알파 블렌딩 기능

 - (2013. 07. 04) 이미지 보이기 On/Off

 - (2013. 07. 05) 회전 기능

 - (2013. 07. 06) 확대, 축소 기능

 - (2013. 07. 08) 스프라이트 노드 추가 (스프라이트->애니메이션->프레임->레이어)

 - (2013. 07. 09) 스프라이트 재생 및 프레임 조절

 - (2013. 07. 14) 마우스 휠을 사용한 작업영역(PictureBox) 확대 및 축소

 - (2013. 07. 14) 프레임 옵션 변경 시 하위 레이어 자동 적용

 - (2013. 07. 15) 스프라이트, 애니메이션, 프레임, 레이어 복사 및 붙여넣기

 - (2013. 07. 27) 스프라이트 이미지 추가방식 변경

 - (2013. 08. 04) 게임 데이터 생성

 - (2013. 08. 04) 동작 확인 완료!



추가 예정 기능

 - 스프라이트에 사용 된 이미지 자동 묶음 저장 or 리소스 이미지로 스프라이트 생성

 - 터치 영역 설정

 

Note.

 - (2013. 07. 27) 기존 방식은 PNG파일을 읽어와 추가 된 모든 이미지를 자동적으로 리소스화 시키려고 했었다가 방법을 바꾸어서

  기존에 Resource탭에서 만들어 놓은 리소스를 가져와서 이미지를 추가하는 방법으로 변경 하였다.

  Sprite탭 안에 있는 또 하나의 Resource 탭에서 메인Resource 탭의 리소스를 받아와 추가가 가능하다.

  이 방법으로 변경하면서 기존에 만들어놓은 스프라이트 추출이 쓸모없게 되었다. ( 나중에 다시 원래 하려던 방식으로 변경 예정 )



'Qb' 카테고리의 다른 글

[#07 - 게임 엔진 만들기]  (0) 2013.08.10
[#06 - 설명] Resource Tab  (0) 2013.06.29
[#03 - 게임 툴 만들기] 리소스 테스트  (0) 2013.06.23
[#02 - 게임 툴 만들기] 이미지 탭  (0) 2013.06.12
[#01 - 게임 툴 만들기] 폼 생성  (0) 2013.06.10



			Bitmap bmp = new Bitmap(tag.getWidth(), tag.getHeight());
			Graphics g = Graphics.FromImage(bmp);

			for ( int i = 0; i < tag.getBmpCount(); i++ )
			{
				g.DrawImage((Image) tag.getBmp(i), tag.getX(i), tag.getY(i));
			}

			bmp.Save(path, ImageFormat.Png);
tag안에 이미지와 좌표정보를 담고있다.

먼저 새로운 비트맵을 하나 생성하고 그림을 그린다.
그림을 그리고 해당 비트맵을 원하는 형식으로 저장하면 됨.
 




+ Recent posts