Skip to content

Commit c0f40ad

Browse files
committed
fix Android EditBox font size issue
1 parent 367a105 commit c0f40ad

File tree

10 files changed

+115
-51
lines changed

10 files changed

+115
-51
lines changed

cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBox.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@ of this software and associated documentation files (the "Software"), to deal
2626

2727
import android.content.Context;
2828
import android.graphics.Color;
29+
import android.graphics.Typeface;
2930
import android.text.InputFilter;
3031
import android.text.InputType;
32+
import android.text.method.PasswordTransformationMethod;
33+
import android.util.Log;
3134
import android.view.Gravity;
3235
import android.view.KeyEvent;
3336
import android.view.View;
@@ -106,6 +109,12 @@ public class Cocos2dxEditBox extends EditText {
106109
private int mInputModeContraints;
107110
private int mMaxLength;
108111

112+
//OpenGL view scaleX
113+
private float mScaleX;
114+
115+
116+
117+
109118
public Cocos2dxEditBox(Context context){
110119
super(context);
111120
}
@@ -121,6 +130,15 @@ public void setEditBoxViewRect(int left, int top, int maxWidth, int maxHeight) {
121130
this.setLayoutParams(layoutParams);
122131
}
123132

133+
public float getOpenGLViewScaleX() {
134+
return mScaleX;
135+
}
136+
137+
public void setOpenGLViewScaleX(float mScaleX) {
138+
this.mScaleX = mScaleX;
139+
}
140+
141+
124142
public void setMaxLength(int maxLength){
125143
this.mMaxLength = maxLength;
126144

@@ -210,6 +228,8 @@ public void setInputFlag(int inputFlag) {
210228
switch (inputFlag) {
211229
case kEditBoxInputFlagPassword:
212230
this.mInputFlagConstraints = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
231+
this.setTypeface(Typeface.DEFAULT);
232+
this.setTransformationMethod(new PasswordTransformationMethod());
213233
break;
214234
case kEditBoxInputFlagSensitive:
215235
this.mInputFlagConstraints = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;

cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,17 @@ public Cocos2dxEditBoxHelper(ResizeLayout layout) {
7575
Cocos2dxEditBoxHelper.mEditBoxArray = new SparseArray<Cocos2dxEditBox>();
7676
}
7777

78+
public static int convertToSP(float point){
79+
Resources r = mCocos2dxActivity.getResources();
7880

79-
public static int createEditBox(final int left, final int top, final int width, final int height) {
81+
int convertedValue = (int)TypedValue.applyDimension(
82+
TypedValue.COMPLEX_UNIT_SP, point, r.getDisplayMetrics());
83+
84+
return convertedValue;
85+
86+
}
87+
88+
public static int createEditBox(final int left, final int top, final int width, final int height, final float scaleX) {
8089
final int index = mViewTag;
8190
mCocos2dxActivity.runOnUiThread(new Runnable() {
8291
@Override
@@ -92,6 +101,17 @@ public void run() {
92101
editBox.setBackgroundColor(Color.TRANSPARENT);
93102
editBox.setTextColor(Color.WHITE);
94103
editBox.setSingleLine();
104+
editBox.setOpenGLViewScaleX(scaleX);
105+
Resources r = mCocos2dxActivity.getResources();
106+
float density = r.getDisplayMetrics().density;
107+
int paddingBottom = (int)(height * 0.33f / density);
108+
paddingBottom = convertToSP(paddingBottom - 5 * scaleX / density);
109+
paddingBottom = paddingBottom / 2;
110+
int paddingTop = paddingBottom;
111+
int paddingLeft = (int)(5 * scaleX / density);
112+
paddingLeft = convertToSP(paddingLeft);
113+
114+
editBox.setPadding(paddingLeft,paddingTop, 0, paddingBottom);
95115

96116

97117
FrameLayout.LayoutParams lParams = new FrameLayout.LayoutParams(
@@ -101,7 +121,7 @@ public void run() {
101121
lParams.leftMargin = left;
102122
lParams.topMargin = top;
103123
lParams.width = width;
104-
lParams.height = height+20;
124+
lParams.height = height;
105125
lParams.gravity = Gravity.TOP | Gravity.LEFT;
106126

107127
mFrameLayout.addView(editBox, lParams);
@@ -222,7 +242,10 @@ public void run() {
222242
}
223243
//TODO: The font size is not the same across all the anroid devices...
224244
if (fontSize >= 0){
225-
editBox.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
245+
float density = mCocos2dxActivity.getResources().getDisplayMetrics().density;
246+
// Log.e("XXX", "density is " + density);
247+
editBox.setTextSize(TypedValue.COMPLEX_UNIT_SP,
248+
fontSize / density );
226249
}
227250
editBox.setTypeface(tf);
228251
}

cocos/platform/android/jni/Java_org_cocos2dx_lib_Cocos2dxHelper.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -390,12 +390,12 @@ void deleteValueForKeyJNI(const char* key)
390390
}
391391
}
392392

393-
int addEditBoxJNI(int left, int top, int width, int height){
393+
int addEditBoxJNI(int left, int top, int width, int height, float scaleX){
394394
JniMethodInfo t;
395395

396396
int ret = -1;
397-
if (JniHelper::getStaticMethodInfo(t, EDITBOX_CLASS_NAME, "createEditBox", "(IIII)I")) {
398-
ret = t.env->CallStaticIntMethod(t.classID, t.methodID, left, top, width, height);
397+
if (JniHelper::getStaticMethodInfo(t, EDITBOX_CLASS_NAME, "createEditBox", "(IIIIF)I")) {
398+
ret = t.env->CallStaticIntMethod(t.classID, t.methodID, left, top, width, height, scaleX);
399399
t.env->DeleteLocalRef(t.classID);
400400
}
401401
return ret;

cocos/platform/android/jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extern void setStringForKeyJNI(const char* key, const char* value);
5555
extern void deleteValueForKeyJNI(const char* key);
5656
extern void conversionEncodingJNI(const char* src, int byteSize, const char* fromCharset, char* dst, const char* newCharset);
5757
//Added for new Android EditBox
58-
extern int addEditBoxJNI(int left, int top, int width, int height);
58+
extern int addEditBoxJNI(int left, int top, int width, int height, float scaleX);
5959
extern void removeEditBoxJNI(int index);
6060
extern void setEditBoxViewRectJNI(int index, int left, int top, int width, int height);
6161
extern void setMaxLengthJNI(int index, int maxLength);

cocos/ui/UIEditBox/UIEditBoxImpl-android.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@
2929

3030
#include "UIEditBox.h"
3131
#include <jni.h>
32-
#include "jni/Java_org_cocos2dx_lib_Cocos2dxBitmap.h"
3332
#include "jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h"
3433
#include "2d/CCLabel.h"
3534
#include "base/ccUTF8.h"
3635
#include "math/Vec2.h"
3736
#include "ui/UIHelper.h"
38-
#include "base/ccUTF8.h"
37+
#include "base/CCDirector.h"
3938

4039
NS_CC_BEGIN
4140

@@ -85,14 +84,30 @@ EditBoxImplAndroid::~EditBoxImplAndroid()
8584

8685
void EditBoxImplAndroid::createNativeControl(const Rect& frame)
8786
{
88-
_editBoxIndex = addEditBoxJNI(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
87+
auto director = cocos2d::Director::getInstance();
88+
auto glView = director->getOpenGLView();
89+
auto frameSize = glView->getFrameSize();
90+
91+
auto winSize = director->getWinSize();
92+
auto leftBottom = _editBox->convertToWorldSpace(Point::ZERO);
93+
94+
auto contentSize = frame.size;
95+
auto rightTop = _editBox->convertToWorldSpace(Point(contentSize.width, contentSize.height));
96+
97+
auto uiLeft = frameSize.width / 2 + (leftBottom.x - winSize.width / 2 ) * glView->getScaleX();
98+
auto uiTop = frameSize.height /2 - (rightTop.y - winSize.height / 2) * glView->getScaleY();
99+
auto uiWidth = (rightTop.x - leftBottom.x) * glView->getScaleX();
100+
auto uiHeight = (rightTop.y - leftBottom.y) * glView->getScaleY();
101+
LOGD("scaleX = %f", glView->getScaleX());
102+
_editBoxIndex = addEditBoxJNI(uiLeft, uiTop, uiWidth, uiHeight, glView->getScaleX());
89103
s_allEditBoxes[_editBoxIndex] = this;
90104
}
91105

92106
void EditBoxImplAndroid::setNativeFont(const char* pFontName, int fontSize)
93107
{
94-
95-
setFontEditBoxJNI(_editBoxIndex, pFontName, fontSize);
108+
auto director = cocos2d::Director::getInstance();
109+
auto glView = director->getOpenGLView();
110+
setFontEditBoxJNI(_editBoxIndex, pFontName, fontSize * glView->getScaleX());
96111
}
97112

98113
void EditBoxImplAndroid::setNativeFontColor(const Color4B& color)

cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,8 @@ bool EditBoxImplCommon::initWithSize(const Size& size)
5959
{
6060
do
6161
{
62-
auto glview = cocos2d::Director::getInstance()->getOpenGLView();
63-
64-
Rect rect = Rect(0, 0, size.width * glview->getScaleX(),size.height * glview->getScaleY());
65-
66-
float factor = cocos2d::Director::getInstance()->getContentScaleFactor();
6762

68-
rect.size.width /= factor;
69-
rect.size.height /= factor;
63+
Rect rect = Rect(0, 0, size.width, size.height);
7064

7165
this->createNativeControl(rect);
7266

@@ -90,7 +84,6 @@ void EditBoxImplCommon::initInactiveLabels(const Size& size)
9084
_editBox->addChild(_label, kLabelZOrder);
9185

9286
_labelPlaceHolder = Label::create();
93-
// align the text vertically center
9487
_labelPlaceHolder->setAnchorPoint(Vec2(0, 0.5f));
9588
_labelPlaceHolder->setColor(Color3B::GRAY);
9689
_editBox->addChild(_labelPlaceHolder, kLabelZOrder);
@@ -256,11 +249,8 @@ void EditBoxImplCommon::setContentSize(const Size& size)
256249
auto director = cocos2d::Director::getInstance();
257250
auto glview = director->getOpenGLView();
258251
Size controlSize = Size(size.width * glview->getScaleX(),size.height * glview->getScaleY());
259-
float factor = director->getContentScaleFactor();
260-
controlSize.width /= factor;
261-
controlSize.height /= factor;
262-
263-
this->setNativeContentSize(size);
252+
253+
this->setNativeContentSize(controlSize);
264254

265255
}
266256

cocos/ui/UIEditBox/UIEditBoxImpl-ios.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030

3131
#include "UIEditBoxImpl-common.h"
3232

33+
34+
3335
@class UIEditBoxImplIOS_objc;
36+
@class UIFont;
3437

3538
NS_CC_BEGIN
3639

cocos/ui/UIEditBox/UIEditBoxImpl-ios.mm

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRang
276276
EditBoxImplIOS::EditBoxImplIOS(EditBox* pEditText)
277277
: EditBoxImplCommon(pEditText)
278278
,_systemControl(nullptr)
279+
, _anchorPoint(Vec2(0.5f, 0.5f))
279280
{
280281

281282
}
@@ -288,10 +289,19 @@ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRang
288289

289290
void EditBoxImplIOS::createNativeControl(const Rect& frame)
290291
{
291-
_systemControl = [[UIEditBoxImplIOS_objc alloc] initWithFrame:CGRectMake(frame.origin.x,
292-
frame.origin.y,
293-
frame.size.width,
294-
frame.size.height)
292+
auto glview = cocos2d::Director::getInstance()->getOpenGLView();
293+
294+
Rect rect(0, 0, frame.size.width * glview->getScaleX(), frame.size.height * glview->getScaleY());
295+
296+
float factor = cocos2d::Director::getInstance()->getContentScaleFactor();
297+
298+
rect.size.width /= factor;
299+
rect.size.height /= factor;
300+
301+
_systemControl = [[UIEditBoxImplIOS_objc alloc] initWithFrame:CGRectMake(rect.origin.x,
302+
rect.origin.y,
303+
rect.size.width,
304+
rect.size.height)
295305
editBox:this];
296306

297307
}
@@ -450,7 +460,12 @@ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRang
450460

451461
void EditBoxImplIOS::setNativeContentSize(const Size& size)
452462
{
453-
[_systemControl setContentSize:CGSizeMake(size.width, size.height)];
463+
auto director = cocos2d::Director::getInstance();
464+
auto glview = director->getOpenGLView();
465+
CCEAGLView *eaglview = static_cast<CCEAGLView *>(glview->getEAGLView());
466+
float factor = eaglview.contentScaleFactor;
467+
468+
[_systemControl setContentSize:CGSizeMake(size.width / factor, size.height / factor)];
454469
}
455470

456471
const char* EditBoxImplIOS::getNativeDefaultFontName()

cocos/ui/UIHelper.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -193,25 +193,25 @@ Rect Helper::restrictCapInsetRect(const cocos2d::Rect &capInsets, const Size& te
193193
return Rect(x, y, width, height);
194194
}
195195

196-
Rect Helper::convertBoundingBoxToScreen(Node* node)
197-
{
198-
auto director = Director::getInstance();
199-
auto glView = director->getOpenGLView();
200-
auto frameSize = glView->getFrameSize();
196+
Rect Helper::convertBoundingBoxToScreen(Node* node)
197+
{
198+
auto director = Director::getInstance();
199+
auto glView = director->getOpenGLView();
200+
auto frameSize = glView->getFrameSize();
201201

202-
auto winSize = director->getWinSize();
203-
auto leftBottom = node->convertToWorldSpace(Point::ZERO);
202+
auto winSize = director->getWinSize();
203+
auto leftBottom = node->convertToWorldSpace(Point::ZERO);
204204

205-
auto contentSize = node->getContentSize();
206-
auto rightTop = node->convertToWorldSpace(Point(contentSize.width, contentSize.height));
205+
auto contentSize = node->getContentSize();
206+
auto rightTop = node->convertToWorldSpace(Point(contentSize.width, contentSize.height));
207207

208-
auto uiLeft = frameSize.width / 2 + (leftBottom.x - winSize.width / 2 ) * glView->getScaleX();
209-
auto uiTop = frameSize.height /2 - (rightTop.y - winSize.height / 2) * glView->getScaleY();
210-
auto uiWidth = (rightTop.x - leftBottom.x) * glView->getScaleX();
211-
auto uiHeight = (rightTop.y - leftBottom.y) * glView->getScaleY();
212-
213-
return Rect(uiLeft, uiTop, uiWidth, uiHeight);
214-
}
208+
auto uiLeft = frameSize.width / 2 + (leftBottom.x - winSize.width / 2 ) * glView->getScaleX();
209+
auto uiTop = frameSize.height /2 - (rightTop.y - winSize.height / 2) * glView->getScaleY();
210+
auto uiWidth = (rightTop.x - leftBottom.x) * glView->getScaleX();
211+
auto uiHeight = (rightTop.y - leftBottom.y) * glView->getScaleY();
212+
213+
return Rect(uiLeft, uiTop, uiWidth, uiHeight);
214+
}
215215
}
216216

217217
NS_CC_END

tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,17 @@ bool UIEditBoxTest::init()
5353
addChild(_TTFShowEditReturn);
5454

5555

56-
auto editBoxSize = Size(visibleSize.width - 100, 60);
56+
auto editBoxSize = Size(visibleSize.width - 100, visibleSize.height * 0.1);
5757

5858
// top
5959
std::string pNormalSprite = "extensions/green_edit.png";
6060
_editName = ui::EditBox::create(editBoxSize, ui::Scale9Sprite::create(pNormalSprite));
6161
_editName->setPosition(Vec2(visibleOrigin.x+visibleSize.width/2, visibleOrigin.y+visibleSize.height*3/4));
62-
_editName->setFontName("Paint Boy");
6362
_editName->setFontColor(Color3B::RED);
6463
_editName->setPlaceHolder("Name:");
6564
_editName->setPlaceholderFontColor(Color3B::WHITE);
6665
_editName->setMaxLength(8);
67-
_editName->setFontSize(editBoxSize.height/2);
66+
_editName->setFontSize(editBoxSize.height/2);
6867
_editName->setText("v👐👊💝");
6968
_editName->setReturnType(ui::EditBox::KeyboardReturnType::DONE);
7069
_editName->setDelegate(this);
@@ -78,7 +77,7 @@ bool UIEditBoxTest::init()
7877
_editPassword->setMaxLength(6);
7978
_editPassword->setInputFlag(ui::EditBox::InputFlag::PASSWORD);
8079
_editPassword->setInputMode(ui::EditBox::InputMode::SINGLE_LINE);
81-
_editPassword->setFontSize(editBoxSize.height/2);
80+
_editPassword->setFontSize(editBoxSize.height/2);
8281
_editPassword->setDelegate(this);
8382
addChild(_editPassword);
8483

@@ -89,7 +88,6 @@ bool UIEditBoxTest::init()
8988
_editEmail->setPlaceHolder("Email:");
9089
_editEmail->setInputMode(ui::EditBox::InputMode::EMAIL_ADDRESS);
9190
_editEmail->setDelegate(this);
92-
_editEmail->setFontSize(bottomButtonSize.height/2);
9391
addChild(_editEmail);
9492

9593
return true;

0 commit comments

Comments
 (0)