개발/ANDROID 안드로이드 / / 2022. 9. 21. 13:58

안드로이드 WheelView 그라데이션 적용

반응형

이번에는 지난번에 만든 WheelView에서

선택된 값의 위와 아래에 각각 그라데이션 효과를 적용해보겠습니다.

 

추가한 wheelview 모듈 package com.wx.wheelview.widget에서

WheelView.java을 수정합니다.

 

WheelView.java

private void refreshTextView(int position, int curPosition, View
        itemView, TextView textView) {
    // textView 리셋
    textView.getPaint().reset();

    if (curPosition == position) { // 选中
        Log.d("setTextView", position + ", " + curPosition + ", " + textView.getText());
        int textColor = mStyle.selectedTextColor != -1 ? mStyle
                .selectedTextColor : (mStyle.textColor != -1 ? mStyle
                .textColor : WheelConstants.WHEEL_TEXT_COLOR);
        float defTextSize = mStyle.textSize != -1 ? mStyle.textSize :
                WheelConstants.WHEEL_TEXT_SIZE;
        float textSize = mStyle.selectedTextSize != -1 ? mStyle
                .selectedTextSize : (mStyle.selectedTextZoom != -1 ?
                (defTextSize * mStyle.selectedTextZoom) :
                defTextSize);
        boolean textBold = mStyle.selectedTextBold;
        setTextView(itemView, textView, textColor, textSize, 1.0f, textBold);
    } else if (curPosition > position){    // 未选中
        Log.d("setTextViewGradient2", position + ", " + curPosition + ", " + textView.getText());
        int textColor = mStyle.textColor != -1 ? mStyle.textColor :
                WheelConstants.WHEEL_TEXT_COLOR;
        float textSize = mStyle.textSize != -1 ? mStyle.textSize :
                WheelConstants.WHEEL_TEXT_SIZE;
        int delta = Math.abs(position - curPosition);
        float alpha = (float) Math.pow(mStyle.textAlpha != -1 ? mStyle.textAlpha :
                WheelConstants
                        .WHEEL_TEXT_ALPHA, delta);
        setTextViewGradientTop(itemView, textView, textColor, textSize, alpha, false);
    } else if (curPosition < position){
        Log.d("setTextViewGradient", position + ", " + curPosition + ", " + textView.getText());
        int textColor = mStyle.textColor != -1 ? mStyle.textColor :
                WheelConstants.WHEEL_TEXT_COLOR;
        float textSize = mStyle.textSize != -1 ? mStyle.textSize :
                WheelConstants.WHEEL_TEXT_SIZE;
        int delta = Math.abs(position - curPosition);
        float alpha = (float) Math.pow(mStyle.textAlpha != -1 ? mStyle.textAlpha :
                WheelConstants
                        .WHEEL_TEXT_ALPHA, delta);
        setTextViewGradientBottom(itemView, textView, textColor, textSize, alpha, false);
    }
}

값이 변경될때 새로 텍스트 뷰를 설정하는 refreshTextView()에서

curPosition와 position에 따라 현재 선택된 값보다 위치가 높은뷰와 아래뷰일때

각각 그라데이션 효과를 지정할 수 있도록

setTextViewGradientTop()와 setTextViewGradientBottom()를 추가합니다.

 

// 선택된 일반 텍스트 뷰
private void setTextView(View itemView, TextView textView, int textColor, float textSize,
                         float textAlpha, boolean textBold) {
    textView.setTextColor(textColor);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize);
    itemView.setAlpha(textAlpha);
    try {
        textView.getPaint().setFakeBoldText(textBold);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

// 하단 그라데이션 효과 적용
private void setTextViewGradientBottom(View itemView, TextView textView, int textColor, float textSize,
                                 float textAlpha, boolean textBold) {
    textView.setTextColor(textColor);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize);
    itemView.setAlpha(textAlpha);

    // 그라데이션
    Shader shader = new LinearGradient(0,0,0,textView.getLineHeight(),
            Color.BLACK, Color.WHITE, Shader.TileMode.REPEAT);
    textView.getPaint().setShader(shader);

    try {
        textView.getPaint().setFakeBoldText(textBold);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

// 상단 그라데이션 효과 적용
private void setTextViewGradientTop(View itemView, TextView textView, int textColor, float textSize,
                                  float textAlpha, boolean textBold) {
    textView.setTextColor(textColor);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize);
    itemView.setAlpha(textAlpha);

    // 그라데이션
    Shader shader = new LinearGradient(0,0,0,textView.getLineHeight(),
            Color.WHITE, Color.BLACK, Shader.TileMode.REPEAT);
    textView.getPaint().setShader(shader);

    try {
        textView.getPaint().setFakeBoldText(textBold);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유