package com.ramijemli.sample.fragment; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.Spinner; import android.widget.TextView; import com.flask.colorpicker.ColorPickerView; import com.flask.colorpicker.builder.ColorPickerDialogBuilder; import com.ramijemli.sample.R; import java.util.ArrayList; import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; public class TextSubFragment extends Fragment { //TEXT COLOR @BindView(R.id.text_color) Button mTextColor; //TEXT SIZE @BindView(R.id.text_size_value) TextView mTextSizeValue; //TEXT FONT @BindView(R.id.font_value) Spinner mFontValue; //TEXT STYLE @BindView(R.id.text_style_value) Spinner mTextStyleValue; //USE SHADOW STATE @BindView(R.id.use_shadow) CheckBox mUseShadow; //SHADOW COLOR @BindView(R.id.shadow_color) Button mShadowColor; //SHADOW RADIUS @BindView(R.id.radius_value) TextView mRadiusValue; //SHADOW DIST X @BindView(R.id.distx_value) TextView mDistXValue; //SHADOW DIST Y @BindView(R.id.disty_value) TextView mDistYValue; private OnTextChangedListener mListener; private Unbinder unbinder; private int shadowColor; public TextSubFragment() { } public static TextSubFragment newInstance() { return new TextSubFragment(); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnTextChangedListener) { mListener = (OnTextChangedListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnTextChangedListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.sub_fragment_text, container, false); unbinder = ButterKnife.bind(this, view); return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setupTextFont(); setupTextStyle(); setupTextShadow(); } @Override public void onDestroyView() { mFontValue.setOnItemSelectedListener(null); mTextStyleValue.setOnItemSelectedListener(null); mUseShadow.setOnCheckedChangeListener(null); unbinder.unbind(); unbinder = null; super.onDestroyView(); } //############################################################################################## BEHAVIOR private void setupTextFont() { List<String> data = new ArrayList<>(); data.add("SYSTEM FONT (DEFAULT)"); data.add("INTERSTELLAR"); data.add("MARSHMELLOWS"); data.add("NUAZ"); data.add("WHALE I TRIED"); ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(getActivity(), R.layout.item_interpolator, data); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mFontValue.setAdapter(dataAdapter); mFontValue.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String font = null; switch (position) { case 1: font = "interstellar.ttf"; break; case 2: font = "marshmallows.ttf"; break; case 3: font = "nuaz.otf"; break; case 4: font = "whaleitried.ttf"; break; } Typeface typeface = (position == 0) ? Typeface.defaultFromStyle(Typeface.NORMAL) : Typeface.createFromAsset(getContext().getResources().getAssets(), font); if (mListener != null) { mListener.onTextFontChanged(typeface); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } private void setupTextStyle() { List<String> data = new ArrayList<>(); data.add("NORMAL"); data.add("BOLD"); data.add("ITALIC"); data.add("BOLD_ITALIC"); ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(getActivity(), R.layout.item_interpolator, data); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mTextStyleValue.setAdapter(dataAdapter); mTextStyleValue.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { int textStyle = -1; switch (position) { case 0: textStyle = Typeface.NORMAL; break; case 1: textStyle = Typeface.BOLD; break; case 2: textStyle = Typeface.ITALIC; break; case 3: textStyle = Typeface.BOLD_ITALIC; break; } if (mListener != null) { mListener.onTextStyleChanged(textStyle); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } private void setupTextShadow() { mUseShadow.setOnCheckedChangeListener((buttonView, isChecked) -> { if (mListener != null) { mListener.onDrawShadowChanged(isChecked); } }); shadowColor = Color.WHITE; } private void tweakTextSize(int size) { int value = getTextViewValue(mTextSizeValue); if (value + size > 100) { value = 100; } else if (value + size <= 10) { value = 10; } else { value += size; } mTextSizeValue.setText(value + " sp"); if (mListener != null) { mListener.onTextSizeChanged((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value, getActivity().getResources().getDisplayMetrics() )); } } private void tweakShadowRadius(int amount) { float value = Float.parseFloat(mRadiusValue.getText().toString()); if (value + amount > 100) { value = 100; } else if (value + amount < 1) { value = 1; } else { value += amount; } mRadiusValue.setText(String.valueOf(value)); if (mListener != null) { mListener.onShadowChanged(shadowColor, value, Float.parseFloat(mDistXValue.getText().toString()), Float.parseFloat(mDistYValue.getText().toString()) ); } } private void tweakDistX(int amount) { float value = Float.parseFloat(mDistXValue.getText().toString()); if (value + amount > 36) { value = 36; } else if (value + amount < 0) { value = 0; } else { value += amount; } mDistXValue.setText(String.valueOf(value)); if (mListener != null) { mListener.onShadowChanged(shadowColor, Float.parseFloat(mRadiusValue.getText().toString()), value, Float.parseFloat(mDistYValue.getText().toString()) ); } } private void tweakDistY(int amount) { float value = Float.parseFloat(mDistYValue.getText().toString()); if (value + amount > 36) { value = 36; } else if (value + amount < 0) { value = 0; } else { value += amount; } mDistYValue.setText(String.valueOf(value)); if (mListener != null) { mListener.onShadowChanged(shadowColor, Float.parseFloat(mRadiusValue.getText().toString()), Float.parseFloat(mDistXValue.getText().toString()), value); } } private int getTextViewValue(TextView view) { String value = view.getText().toString(); return Integer.parseInt(value.substring(0, value.length() - 3)); } //############################################################################################## ACTIONS @OnClick(R.id.text_color) void textColorAction() { ColorPickerDialogBuilder .with(getActivity()) .setTitle("Choose text color") .initialColor(Color.WHITE) .wheelType(ColorPickerView.WHEEL_TYPE.FLOWER) .density(6) .setPositiveButton("SET", (dialog, selectedColor, allColors) -> { mTextColor.setBackgroundTintList(ColorStateList.valueOf(selectedColor)); if (mListener != null) { mListener.onTextColorChanged(selectedColor); } }) .setNegativeButton("DISMISS", (dialog, which) -> { }) .build() .show(); } @OnClick(R.id.increment_text_size) void incrementTextSizeAction() { tweakTextSize(2); } @OnClick(R.id.decrement_text_size) void decrementTextSizeAction() { tweakTextSize(-2); } @OnClick(R.id.shadow_color) void shadowColorAction() { ColorPickerDialogBuilder .with(getActivity()) .setTitle("Choose shadow color") .initialColor(Color.WHITE) .wheelType(ColorPickerView.WHEEL_TYPE.FLOWER) .density(6) .setPositiveButton("SET", (dialog, selectedColor, allColors) -> { shadowColor = selectedColor; mShadowColor.setBackgroundTintList(ColorStateList.valueOf(selectedColor)); if (mListener != null) { mListener.onShadowChanged(shadowColor, Float.parseFloat(mRadiusValue.getText().toString()), Float.parseFloat(mDistXValue.getText().toString()), Float.parseFloat(mDistYValue.getText().toString())); } }) .setNegativeButton("DISMISS", (dialog, which) -> { }) .build() .show(); } @OnClick(R.id.increment_shadow) void incrementShadowAction() { tweakShadowRadius(1); } @OnClick(R.id.decrement_shadow) void decrementShadowAction() { tweakShadowRadius(-1); } @OnClick(R.id.increment_distx) void incrementDistXAction() { tweakDistX(1); } @OnClick(R.id.decrement_distx) void decrementDistXAction() { tweakDistX(-1); } @OnClick(R.id.increment_disty) void incrementDistYAction() { tweakDistY(1); } @OnClick(R.id.decrement_disty) void decrementDistYAction() { tweakDistY(-1); } //############################################################################################## LISTENER public interface OnTextChangedListener { void onTextColorChanged(int color); void onTextSizeChanged(int textSize); void onTextFontChanged(Typeface typeface); void onTextStyleChanged(int textStyle); void onDrawShadowChanged(boolean draw); void onShadowChanged(int color, float blur, float distX, float distY); } }