2. 기본 안드로이드 소스 코드에 이 기능을 추가합니다.
아이디어: 먼저 인터페이스를 만든 다음 시스템 테이블에서 선택한 값을 데이터베이스 (ADB 셸 entry) data/data/com.android.providers.settings/databases/에 저장합니다
그런 다음 Launch2 의 소스 코드에서 관련 코드를 실행하기 위해 데이터베이스에서 순환 데스크탑을 선택할지 여부를 가져옵니다.
먼저 UI 를 만듭니다.
소스 코드를 설정하는 accessibility_settings.xml 파일에 확인란을 추가합니다.
자바 코드
안드로이드: 키 = "launch _ repeat"
안드로이드: 제목 = "@ string/launch _ repeat _ title"
안드로이드: persistent = "false"/>
소스 코드를 설정하는 RES 에 관련 코드를 추가합니다.
Values/string.xml 의 Add (영어):
반복 발사
Values-ko-rcn/string.xml 에 추가 (중국어 표시):
"루프 데스크톱"
OnCreate 의 소스 코드 설정 AccessibilitySettings.java 에 다음을 추가합니다.
자바 코드
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Mlaunchrepeat = (checkbox preference) findpreference (
발사 _ 반복);
Int LaunchRepeat = 설정. System.getint (this.getcontentresolver (),
"발사 _ 반복", 0); //체크아웃을 선택하셨습니까
If(LaunchRepeat== 1)// 선택하면 다음에 설정을 열 때 체크합니다.
Mlaunchrepeat.setchecked (true);
기타
Mlaunchrepeat.setchecked (false); //선택하지 않으면 다음에 설정을 열 때 확인하지 않습니다.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
물론 정의해야 할 몇 가지 양이 있습니다.
개인 최종 문자열 LAUNCH_REPEAT =
"시작 _ 반복";
Private checkbox preference mlaunchrepeat;
OnPreferenceTreeClick 함수에 다음을 추가합니다.
자바 코드
//xxnan 에 의해 추가됨
If (launch _ repeat.equals (키))
{
설정. System.putint (getcontent resolver (),
"시작 _ 반복",
((CheckBoxPreference) 기본 설정). IsChecked ()?
1:0); //시스템의 시스템 테이블에 저장하도록 선택합니다.
}
//xxnan 에 의해 추가됨
완료되면 "데스크톱 루프" 를 클릭하여 data/data/com.android.providers.settings/databases 아래의 settings.db 데이터베이스 (sqlites
33 | launch _ repeat |1(select * from system; ) 을 참조하십시오.
이 시점에서 데이터는 시스템 테이블과 UI 에 저장되며, 다음 단계는 루치 2 소스 코드에서 이 값을 가져오는 것입니다 (루프 여부와 관계 없음).
Launcher2 소스 코드로 이동하여 Workspace.java 파일을 찾습니다.
OnTouchEvent 에서 이전 수정 기간은 다음과 같습니다.
자바 코드
사례 운동 사건. 조치 _ 조치:
If (mtouchstate = = touch _ state _ scrolling) {
최종 velocity tracker velocity tracker = mvelocity tracker;
Velocitytracker.computecurrentvelocity (1000, mmaximumpvelocity);
최종 int velocityX = (int)
Velocitytracker.getxvelocity (mactivepointerid);
Final int screen width = getwidth ();
Final intwhich screen = (MSC rollx+(screen width/2))/screen width;
Final float scrolled pos = (float) MSC rollx/screen width;
Log.i("velocityX ","velocity x = "+velocity x+"which screen = "+which screen);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//xxnan 에 의해 수정됨
If(velocity x>;; 스냅샷 속도) {
//힘껏 왼쪽으로 이동합니다.
//한 번에 여러 화면을 건너뛰지 마십시오.
Log.i("numscreen ","numscreen = "+mcurrentscreen);
/* final intbound = scrolled pos < 어느 화면입니까?
(((mcurrentscreen+getchildcount ())-1)% getchildcount ():
MCurrentScreen*/
Finalintbound = ((mcurrentscreen+getchildcount ())-1)% getchildcount ()
Log.i("numscreen ","bound = "+bound);
SnapToScreen( bound, velocityX, true);
} else if(velocity x<;; -스냅샷 속도) {
//힘을 주어 오른쪽으로 이동합니다
//한 번에 여러 화면을 건너뛰지 마십시오.
/* final intbound = scrolled pos > 어느 화면입니까?
(mcurrentscreen+1)% getchildcount (): mcurrentscreen; */
Finalintbound = (mcurrentscreen+1)% getchildcount ();
SnapToScreen(bound, velocityX, true);
} 그렇지 않으면 {
SnapToScreen(whichScreen, 0, true);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//여기 기본 코드가 있습니다.
/* if (velocity x > SNAP _ 속도 & amp& ampmCurrentScreen & gt0) {
//힘껏 왼쪽으로 이동합니다.
//한 번에 여러 화면을 건너뛰지 마십시오.
Final int bound = scrolledPos & lt 어떤 화면?
Mcurrentscreen-1:mcurrentscreen;
Snapto screen (math.min (which screen, bound), velocityX, true);
} else if(velocity x<;; -snap _ velocity & & ampmCurrentScreen & lt
GetChildCount()-1) {
//힘을 주어 오른쪽으로 이동합니다
//한 번에 여러 화면을 건너뛰지 마십시오.
Final int bound = scrolledPos & gt 어떤 화면?
Mcurrentscreen+1:mcurrentscreen;
Snapto screen (math.max (which screen, bound), velocityX, true);
} 그렇지 않으면 {
SnapToScreen(whichScreen, 0, true);
} */
}
MTouchState = TOUCH _ STATE _ REST 입니다
Mactive pointer id = invalid _ pointer;
Releasevelocitytracker ();
깨뜨리다
그런 다음 수정 된 장소에 판단을 추가하십시오. 시스템에서 얻은 값이 1 이면 순환할 수 있고 0 이면 안 됩니다.
코드를 다음과 같이 수정합니다.
자바 코드
사례 운동 사건. 조치 _ 조치:
If (mtouchstate = = touch _ state _ scrolling) {
최종 velocity tracker velocity tracker = mvelocity tracker;
Velocitytracker.computecurrentvelocity (1000, mmaximumpvelocity);
최종 int velocityX = (int)
Velocitytracker.getxvelocity (mactivepointerid);
Final int screen width = getwidth ();
Final intwhich screen = (MSC rollx+(screen width/2))/screen width;
Final float scrolled pos = (float) MSC rollx/screen width;
Log.i("velocityX ","velocity x = "+velocity x+"which screen = "+which screen);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//수정자: xxnan 20 13- 1-9
Launch _ repeat = 설정. System.getint (mcontext.getcontentresolver (),
"발사 _ 반복", 0); //시스템 테이블에서 "launch_repeat" 의 값을 가져옵니다.
Log.i(" launch_repeat ","launch _ repeat = "+launch _ repeat);
If(launch_repeat== 1)// 가 1 이면 순환됩니다. 즉, 이전에 수정되었습니다.
{
If(velocity x>;; 스냅샷 속도) {
//힘껏 왼쪽으로 이동합니다.
//한 번에 여러 화면을 건너뛰지 마십시오.
Log.i("numscreen ","numscreen = "+mcurrentscreen);
/* final intbound = scrolled pos < 어느 화면입니까?
(((mcurrentscreen+getchildcount ())-1)% getchildcount ():
MCurrentScreen*/
Finalintbound = ((mcurrentscreen+getchildcount ())-1)% getchildcount ()
Log.i("numscreen ","bound = "+bound);
SnapToScreen( bound, velocityX, true);
} else if(velocity x<;; -스냅샷 속도) {
//힘을 주어 오른쪽으로 이동합니다
//한 번에 여러 화면을 건너뛰지 마십시오.
/* final intbound = scrolled pos > 어느 화면입니까?
(mcurrentscreen+1)% getchildcount (): mcurrentscreen; */
Finalintbound = (mcurrentscreen+1)% getchildcount ();
SnapToScreen(bound, velocityX, true);
} 그렇지 않으면 {
SnapToScreen(whichScreen, 0, true);
}
}
Else// 0 이면 로컬 코드이며 반복되지 않습니다.
{
If(velocity x>;; SNAP _ 속도 & amp& ampmCurrentScreen & gt0) {
//힘껏 왼쪽으로 이동합니다.
//한 번에 여러 화면을 건너뛰지 마십시오.
Final int bound = scrolledPos & lt 어떤 화면?
Mcurrentscreen-1:mcurrentscreen;
Snapto screen (math.min (which screen, bound), velocityX, true);
} else if(velocity x<;; -snap _ velocity & & ampmCurrentScreen & lt
GetChildCount()-1) {
//힘을 주어 오른쪽으로 이동합니다
//한 번에 여러 화면을 건너뛰지 마십시오.
Final int bound = scrolledPos & gt 어떤 화면?
Mcurrentscreen+1:mcurrentscreen;
Snapto screen (math.max (which screen, bound), velocityX, true);
} 그렇지 않으면 {
SnapToScreen(whichScreen, 0, true);
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//여기 기본 코드가 있습니다.
/* if (velocity x > SNAP _ 속도 & amp& ampmCurrentScreen & gt0) {
//힘껏 왼쪽으로 이동합니다.
//한 번에 여러 화면을 건너뛰지 마십시오.
Final int bound = scrolledPos & lt 어떤 화면?
Mcurrentscreen-1:mcurrentscreen;
Snapto screen (math.min (which screen, bound), velocityX, true);
} else if(velocity x<;; -snap _ velocity & & ampmCurrentScreen & lt
GetChildCount()-1) {
//힘을 주어 오른쪽으로 이동합니다
//한 번에 여러 화면을 건너뛰지 마십시오.
Final int bound = scrolledPos & gt 어떤 화면?
Mcurrentscreen+1:mcurrentscreen;
Snapto screen (math.max (which screen, bound), velocityX, true);
} 그렇지 않으면 {
SnapToScreen(whichScreen, 0, true);
} */
}
MTouchState = TOUCH _ STATE _ REST 입니다
Mactive pointer id = invalid _ pointer;
Releasevelocitytracker ();
깨뜨리다
물론 몇 개의 수량을 정의하려면 몇 개의 패키지를 가져와야 합니다.
패키지 가져오기:
//xxnan 에 의해 추가됨
Android.content.contentresolver 가져오기 //시스템 테이블에서 데이터 가져오기
Android.provider.setting 을 가져옵니다.
변수를 정의합니다.
Private int launch _ repeat// 루프 여부를 가져오는 값입니다.
여기서 수정한 다음 소스 코드에서 Launch2 의 소스 코드와 package/apps 설정을 컴파일하면 out/target/ 이 생성됩니다. 。 /시스템/응용 프로그램 아래
Launch2.apk 와 Settings.apk 는 휴대폰에 있는 system/app 의 두 apk 를 대체할 수 있습니다.