Android 개발 진급 사용자 정의 컨트롤 의 미끄럼 스위치 실현 방법【데모 소스 다운로드 첨부】
11882 단어 Android사용자 정의 컨트롤슬라이딩 스위치
사용자 정의 스위치 컨트롤
Android 사용자 정의 컨트롤 은 일반적으로 세 가지 방식 이 있 습 니 다.
1.안 드 로 이 드 고유의 컨트롤 을 계승 하여 안 드 로 이 드 네 이 티 브 컨트롤 을 바탕 으로 기능 과 논 리 를 추가 합 니 다.
2.ViewGroup 을 계승 합 니 다.이러한 사용자 정의 컨트롤 은 자신의 레이아웃 에 다른 하위 컨트롤 을 추가 할 수 있 습 니 다.
3.View 를 계승 합 니 다.이러한 사용자 정의 컨트롤 은 원래 의 컨트롤 과 비슷 한 부분 이 많 지 않 고 자신의 뱃속 에 다른 하위 컨트롤 을 추가 할 필요 가 없습니다.
ToggleView 사용자 정의 스위치 컨트롤 표징 에 Android 네 이 티 브 컨트롤 과 비슷 한 점 이 없고 미 끄 러 지 는 효과 에 도 Android 네 이 티 브 를 답습 하 는 곳 이 없 기 때문에 사용자 정의 ToggleView 는 계승 View 를 선택 합 니 다.
같은 사용자 정의 컨트롤 은 세 가지 구조 방법 을 복사 해 야 합 니 다.
// , style ,
public ToggleView(Context context, AttributeSet attrs, int defStyle);
//
public ToggleView(Context context, AttributeSet attrs)
// Java new ,
public ToggleView(Context context)
사용자 정의 컨트롤 이기 때문에 속성 은 스스로 정의 하 는 것 이 좋 습 니 다.여기 서 세 개의 속성 을 정의 합 니 다.1.배경 그림
2.슬라이더 의 그림
3.레이아웃 의 기본 스위치 상태
그래서 사용자 정의 속성 을 사용 해 야 합 니 다.
values 디 렉 터 리 에 새 xml 파일,attrs.xml
안에서 자신의 속성 을 정의 합 니 다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="toggle">
<attr name="switchBackground" format="reference" />
<attr name="slidingBackground" format="reference" />
<attr name="toggleState" format="boolean" />
</declare-styleable>
</resources>
여기 서 세 개의 속성 이름과 속성 유형 을 정의 합 니 다.
속성 과 사용자 정의 컨트롤 의 세 가지 구조 방법 이 완료 되 었 습 니 다.레이아웃 파일 에 사용자 정의 컨트롤 을 추가 할 수 있 습 니 다.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:hss="http://schemas.android.com/apk/res/com.hss.toggle"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.hss.toggle.ToggleView
android:id="@+id/toggleView"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_centerInParent="true"
hss:switchBackground="@drawable/switch_background"
hss:slidingBackground="@drawable/slide_button_background"
hss:toggleState="true"
>
</com.hss.toggle.ToggleView>
</RelativeLayout>
메모:내 가 사용자 정의 컨트롤 com.hss.toggle.Toggle View 에서 일부 속성 은 안 드 로 이 드 로 시작 하고 일부 속성 은 hss(내 가 정의 한 네 임 스페이스)로 시작 합 니 다.왜 일 까요?이 영화 코드 두 번 째 줄 을 잘 보 세 요.
xmlns:hss="http://schemas.android.com/apk/res/com.hss.toggle"
나 는 여기에 한 줄 의 코드 를 쓰 고 있다.이것 은 values/attrs.xml 의 모든 항목 을 가 져 오 면 내 가 attrs.xml 에 있 는 속성 을 직접 사용 할 수 있다 는 것 을 설명 한다.사용자 정의 속성 을 직접 사용 할 수 있 습 니 다.문 제 는 자바 코드 에서 사용자 정의 속성 값 을 어떻게 얻 느 냐 에 초점 을 맞 춰 야 합 니 다.
네 임 스페이스 와 사용자 정의 속성의 name 값 을 가 져 옵 니 다.코드 를 보십시오:
String namespace = "http://schemas.android.com/apk/res/com.hss.toggle";
int toggle_switchbackground = attrs.getAttributeResourceValue(namespace, "switchBackground", -1);
int toggle_slidingbackground = attrs.getAttributeResourceValue(namespace, "slidingBackground", -1);
toggle_state = attrs.getAttributeBooleanValue(namespace, "toggleState", false);
봤 어?이 방법 은 attr 인 자 를 사 용 했 기 때문에 사용자 정의 속성 값 을 가 져 오 는 작업 은 두 개의 인자 에서 실행 되 어야 합 니 다.전체 사용자 정의 컨트롤 의 클래스 참조 코드:
package com.hss.toggle;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
*
* @author hss
*/
public class ToggleView extends View {
private static final String TAG = "ToogleView";
private Bitmap sliding_background;
private Bitmap switch_background;
private boolean isSliding = false;
private boolean toggle_state = false;
private int downX;
private mToggleStateChangeListener;
// , xml , style
public ToggleView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
// , xml , style
public ToggleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
// Java xml
String namespace = "http://schemas.android.com/apk/res/com.hss.toggle";
int toggle_switchbackground = attrs.getAttributeResourceValue(namespace, "switchBackground", -1);
int toggle_slidingbackground = attrs.getAttributeResourceValue(namespace, "slidingBackground", -1);
toggle_state = attrs.getAttributeBooleanValue(namespace, "toggleState", false);
Log.i(TAG,""+toggle_slidingbackground+" "+toggle_switchbackground);
//
setToggleSwitchBackground(toggle_switchbackground);
setToggleSlidingBackground(toggle_slidingbackground);
setToggleState(toggle_state);
}
// new
public ToggleView(Context context) {
this(context, null);
}
/**
*
*
* @param toggle_slidingbackground ID
*/
private void setToggleSlidingBackground(int toggle_slidingbackground) {
sliding_background = BitmapFactory.decodeResource(getResources(),toggle_slidingbackground);
}
/**
* ,
*
* @param toggle_switchbackground ID
*/
private void setToggleSwitchBackground(int toggle_switchbackground) {
switch_background = BitmapFactory.decodeResource(getResources(),toggle_switchbackground);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// ,
setMeasuredDimension(switch_background.getWidth(),switch_background.getHeight());
}
@Override
protected void onDraw(Canvas canvas) {
// , canvas
canvas.drawBitmap(switch_background, 0, 0, null);
if (isSliding) {
//
// :( x )-( x )
int left = downX - sliding_background.getWidth() / 2;
// ( ) :( )-( )
int rightAlign = switch_background.getWidth()- sliding_background.getWidth();
// 0,,
if (left < 0) {
left = 0;
} else if (left > rightAlign) {
// 》 ,
left = rightAlign;
}
//
canvas.drawBitmap(sliding_background, left, 0, null);
} else {
// , ,
if (toggle_state) {
// ,
int left = switch_background.getWidth() - sliding_background.getWidth();
canvas.drawBitmap(sliding_background, left, 0, null);
} else {
// ,
canvas.drawBitmap(sliding_background, 0, 0, null);
}
}
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// , ,
isSliding = true;
downX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
downX = (int) event.getX();
break;
case MotionEvent.ACTION_UP:
// , x
downX = (int) event.getX();
isSliding = false;
//
int center = switch_background.getWidth() / 2;
boolean state = downX > center;
// , ,
if (toggle_state != state) {
toggle_state = state;
if (null != mToggleStateChangeListener) {
mToggleStateChangeListener
.onToggleState(toggle_state);
}
}
break;
}
// onDraw()
invalidate();
return true;
}
//
public void setOnToggleStateLinstener(OnToggleStateChangeListener listen){
mToggleStateChangeListener = listen;
}
public void setToggleState(boolean b) {
toggle_state = b;
}
// ,
public interface OnToggleStateChangeListener {
public void onToggleState(boolean state);
}
}
여기 서 사용자 정의 컨트롤 부분의 논 리 를 다 썼 습 니 다.빌려 서 MainActivity 에서 호출 하 십시오.
package com.hss.toggle;
import android.app.Activity;
import android.os.Bundle;
import com.hss.toggle.ToggleView.OnToggleStateChangeListener;
import com.hss.toggle.utils.ToastUtil;
public class MainActivity extends Activity{
private ToggleView toggleView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toggleView = (ToggleView) findViewById(R.id.toggleView);
toggleView.setOnToggleStateLinstener(new OnToggleStateChangeListener() {
@Override
public void onToggleState(boolean state) {
showToast(state);
}
});
}
// Toast
private void showToast(boolean state) {
ToastUtil.makeSuddenlyToast(getApplicationContext(), state?" ":" ");
}
}
ToastUtil 클래스 는 다음 과 같 습 니 다:
package com.hss.toggle.utils;
import android.content.Context;
import android.widget.Toast;
/**
* @title Toast
* @author hss
*/
public class ToastUtil {
private static Toast toast;
/**
* Toast
* @param context
* @param text
*/
public static void makeShortToast(Context context,String text){
toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
toast.show();
}
/**
* Toast
* @param context
* @param text
*/
public static void makeLongToast(Context context,String text){
toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
toast.show();
}
/**
* Toast
* @param context
* @param text
*/
public static void makeSuddenlyToast(Context context,String text){
if(toast==null){
toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
}
toast.setText(text);
toast.show();
}
}
요약 하면 이번 사용자 정의 컨트롤 절 차 는 다음 과 같 습 니 다.1.values/attrs.xml 에서 속성 과 속성 값 을 사용자 정의 하 는 데이터 형식
2.자바 코드 에서 사용자 정의 컨트롤 류 를 정의 하고 View 나 ViewGroup 또는 Android 원생 의 컨트롤 을 계승 하여 구조 방법 을 실현 하고 사용자 정의 속성의 값 을 얻 으 며 해당 하 는 논리 와 클릭 이 벤트 를 작성 합 니 다.
3.레이아웃 파일 에 사용자 정의 컨트롤 과 사용자 정의 속성 을 사용 합 니 다(네 임 스페이스 주의).
4.MainActivity 에서 호출
전체 인 스 턴 스 코드 는 여 기 를 클릭 하 십시오본 사이트 다운로드
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.