Loading...
Searching...
No Matches
ZoomControls.java
Go to the documentation of this file.
1package com.navigine.view.widgets;
2
3import android.content.Context;
4import android.graphics.Color;
5import android.graphics.drawable.ShapeDrawable;
6import android.graphics.drawable.shapes.RoundRectShape;
7import android.view.Gravity;
8import android.view.View;
9import android.view.ViewGroup;
10import android.widget.Button;
11import android.widget.FrameLayout;
12import android.widget.LinearLayout;
13
14import androidx.annotation.NonNull;
15import androidx.annotation.Nullable;
16
17import com.navigine.view.widgets.ZoomControlsConfig;
18
28public class ZoomControls extends FrameLayout {
29
31 public interface OnZoomInListener {
32 void onZoomIn();
33 }
34
36 public interface OnZoomOutListener {
37 void onZoomOut();
38 }
39
40 private OnZoomInListener onZoomInListener;
41 private OnZoomOutListener onZoomOutListener;
42 private ZoomControlsConfig config;
43
47 public ZoomControls(@NonNull Context context, OnZoomInListener onZoomIn, OnZoomOutListener onZoomOut) {
48 this(context, onZoomIn, onZoomOut, null);
49 }
50
54 public ZoomControls(@NonNull Context context, OnZoomInListener onZoomIn, OnZoomOutListener onZoomOut,
55 @Nullable ZoomControlsConfig config) {
56 super(context);
57 this.onZoomInListener = onZoomIn;
58 this.onZoomOutListener = onZoomOut;
59 this.config = config;
60 setupUI();
61 }
62
63 private void setupUI() {
64 ZoomControlsConfig c = config != null ? config : ZoomControlsConfig.defaultConfig();
65 int textColor = c.getTextColor() != null ? c.getTextColor() : WidgetStyles.BASE_BLACK;
67
68 Button zoomInButton = new Button(getContext(), null, android.R.attr.borderlessButtonStyle);
69 if (c.getZoomInIcon() != null) {
70 zoomInButton.setCompoundDrawablesWithIntrinsicBounds(null, c.getZoomInIcon(), null, null);
71 zoomInButton.setText("");
72 } else {
73 zoomInButton.setText("+");
74 }
75 zoomInButton.setTextSize(WidgetStyles.BUTTON_FONT_SIZE);
76 zoomInButton.setTextColor(textColor);
77 zoomInButton.setBackground(createRoundedBackground(true, bgColor));
78 zoomInButton.setPadding(0, 0, 0, 0);
79 zoomInButton.setStateListAnimator(null);
80
81 Button zoomOutButton = new Button(getContext(), null, android.R.attr.borderlessButtonStyle);
82 if (c.getZoomOutIcon() != null) {
83 zoomOutButton.setCompoundDrawablesWithIntrinsicBounds(null, c.getZoomOutIcon(), null, null);
84 zoomOutButton.setText("");
85 } else {
86 zoomOutButton.setText("−");
87 }
88 zoomOutButton.setTextSize(WidgetStyles.BUTTON_FONT_SIZE);
89 zoomOutButton.setTextColor(textColor);
90 zoomOutButton.setBackground(createRoundedBackground(false, bgColor));
91 zoomOutButton.setPadding(0, 0, 0, 0);
92 zoomOutButton.setStateListAnimator(null);
93
94 zoomInButton.setOnClickListener(v -> {
95 if (onZoomInListener != null) {
96 onZoomInListener.onZoomIn();
97 }
98 });
99 zoomOutButton.setOnClickListener(v -> {
100 if (onZoomOutListener != null) {
101 onZoomOutListener.onZoomOut();
102 }
103 });
104
105 LinearLayout stack = new LinearLayout(getContext());
106 stack.setOrientation(LinearLayout.VERTICAL);
107 stack.setBackgroundColor(Color.TRANSPARENT);
108
109 stack.setElevation(dpToPx((int) WidgetStyles.SHADOW_ELEVATION));
110 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
111 stack.setOutlineAmbientShadowColor(WidgetStyles.SHADOW_COLOR);
112 stack.setOutlineSpotShadowColor(WidgetStyles.SHADOW_COLOR);
113 }
114
115 LinearLayout.LayoutParams btnLp = new LinearLayout.LayoutParams(
116 ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f);
117 stack.addView(zoomInButton, btnLp);
118 stack.addView(zoomOutButton, btnLp);
119
120 FrameLayout.LayoutParams stackLp = new FrameLayout.LayoutParams(
121 ViewGroup.LayoutParams.MATCH_PARENT,
122 ViewGroup.LayoutParams.MATCH_PARENT
123 );
124 stack.setLayoutParams(stackLp);
125
126 addView(stack);
127 }
128
129 private ShapeDrawable createRoundedBackground(boolean isTopButton) {
130 return createRoundedBackground(isTopButton, WidgetStyles.BUTTON_BACKGROUND_COLOR);
131 }
132
133 private ShapeDrawable createRoundedBackground(boolean isTopButton, int color) {
134 float radius = dpToPx((int) WidgetStyles.BORDER_RADIUS);
135 float[] radii = isTopButton
136 ? new float[]{radius, radius, radius, radius, 0, 0, 0, 0}
137 : new float[]{0, 0, 0, 0, radius, radius, radius, radius};
138
139 ShapeDrawable drawable = new ShapeDrawable(new RoundRectShape(radii, null, null));
140 drawable.getPaint().setAntiAlias(true);
141 drawable.getPaint().setColor(color);
142 return drawable;
143 }
144
145 @Override
146 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
147 ZoomControlsConfig c = config != null ? config : ZoomControlsConfig.defaultConfig();
148 float widthDp = c.getButtonWidth() > 0 ? c.getButtonWidth() : WidgetStyles.STANDARD_BUTTON_WIDTH;
150 int width = dpToPx((int) widthDp);
151 int height = dpToPx((int) heightDp);
152 int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
153 int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
154 super.onMeasure(widthSpec, heightSpec);
155 }
156
158 public void applyConfig(@Nullable ZoomControlsConfig newConfig) {
159 config = newConfig;
160 if (getChildCount() > 0) {
161 View stack = getChildAt(0);
162 if (stack instanceof android.widget.LinearLayout) {
163 android.widget.LinearLayout linearLayout = (android.widget.LinearLayout) stack;
164 if (linearLayout.getChildCount() >= 2) {
165 ZoomControlsConfig c = config != null ? config : ZoomControlsConfig.defaultConfig();
166 int textColor = c.getTextColor() != null ? c.getTextColor() : WidgetStyles.BASE_BLACK;
168 View zoomIn = linearLayout.getChildAt(0);
169 View zoomOut = linearLayout.getChildAt(1);
170 if (zoomIn instanceof Button) {
171 Button btn = (Button) zoomIn;
172 btn.setTextColor(textColor);
173 btn.setBackground(createRoundedBackground(true, bgColor));
174 if (c.getZoomInIcon() != null) {
175 btn.setCompoundDrawablesWithIntrinsicBounds(null, c.getZoomInIcon(), null, null);
176 btn.setText("");
177 } else {
178 btn.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
179 btn.setText("+");
180 }
181 }
182 if (zoomOut instanceof Button) {
183 Button btn = (Button) zoomOut;
184 btn.setTextColor(textColor);
185 btn.setBackground(createRoundedBackground(false, bgColor));
186 if (c.getZoomOutIcon() != null) {
187 btn.setCompoundDrawablesWithIntrinsicBounds(null, c.getZoomOutIcon(), null, null);
188 btn.setText("");
189 } else {
190 btn.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
191 btn.setText("−");
192 }
193 }
194 }
195 }
196 }
197 }
198
199 private int dpToPx(int dp) {
200 return (int) (dp * getResources().getDisplayMetrics().density + 0.5f);
201 }
202}