React Native Android get device's ratio
I'm using Camera that comes from expo
package and I'm having trouble with camera view distortion. My phone has 2:1
ratio, which is non-standard.
When I use getSupportedRatiosAsync
method of the camera, I get all kinds of ratios like 1:1
, 2:1
, 4:3
, 16:9
, however only 2:1
looks good.
How can I select a ratio that fits device's natural resolution? Is there a way, to access device's preferred ratio? Or is there any hack around it, like always selecting 16:9
and having the camera component add black margins, where the actual device's ratio is not fitting the 16:9
?
EDIT:
My phone resolution is 2196x1080
, therefore correct ratio should be 2:1
. But I'm unable to come up with a function that would compute 2196x1080
=>2:1
, since (2 * 1080) !== 2196
Is there any way how to infer best possible ratio even for such stupid resolutions?
android react-native android-camera react-native-android expo
add a comment |
I'm using Camera that comes from expo
package and I'm having trouble with camera view distortion. My phone has 2:1
ratio, which is non-standard.
When I use getSupportedRatiosAsync
method of the camera, I get all kinds of ratios like 1:1
, 2:1
, 4:3
, 16:9
, however only 2:1
looks good.
How can I select a ratio that fits device's natural resolution? Is there a way, to access device's preferred ratio? Or is there any hack around it, like always selecting 16:9
and having the camera component add black margins, where the actual device's ratio is not fitting the 16:9
?
EDIT:
My phone resolution is 2196x1080
, therefore correct ratio should be 2:1
. But I'm unable to come up with a function that would compute 2196x1080
=>2:1
, since (2 * 1080) !== 2196
Is there any way how to infer best possible ratio even for such stupid resolutions?
android react-native android-camera react-native-android expo
"My phone resolution is 2196x1080, therefore correct ratio should be 2:1." - The camera ratio is not necessarily the same size as the device screen ratio. Take a look at your native camera app - does it have a status bar? Does it have space for the button used to take the picture? If yes to either of these, then that explains the discepency between your phone display resolution and your camera resolution.
– markmoxx
Dec 12 '18 at 14:41
add a comment |
I'm using Camera that comes from expo
package and I'm having trouble with camera view distortion. My phone has 2:1
ratio, which is non-standard.
When I use getSupportedRatiosAsync
method of the camera, I get all kinds of ratios like 1:1
, 2:1
, 4:3
, 16:9
, however only 2:1
looks good.
How can I select a ratio that fits device's natural resolution? Is there a way, to access device's preferred ratio? Or is there any hack around it, like always selecting 16:9
and having the camera component add black margins, where the actual device's ratio is not fitting the 16:9
?
EDIT:
My phone resolution is 2196x1080
, therefore correct ratio should be 2:1
. But I'm unable to come up with a function that would compute 2196x1080
=>2:1
, since (2 * 1080) !== 2196
Is there any way how to infer best possible ratio even for such stupid resolutions?
android react-native android-camera react-native-android expo
I'm using Camera that comes from expo
package and I'm having trouble with camera view distortion. My phone has 2:1
ratio, which is non-standard.
When I use getSupportedRatiosAsync
method of the camera, I get all kinds of ratios like 1:1
, 2:1
, 4:3
, 16:9
, however only 2:1
looks good.
How can I select a ratio that fits device's natural resolution? Is there a way, to access device's preferred ratio? Or is there any hack around it, like always selecting 16:9
and having the camera component add black margins, where the actual device's ratio is not fitting the 16:9
?
EDIT:
My phone resolution is 2196x1080
, therefore correct ratio should be 2:1
. But I'm unable to come up with a function that would compute 2196x1080
=>2:1
, since (2 * 1080) !== 2196
Is there any way how to infer best possible ratio even for such stupid resolutions?
android react-native android-camera react-native-android expo
android react-native android-camera react-native-android expo
edited Nov 25 '18 at 21:03
Albert Nemec
asked Nov 25 '18 at 13:09
Albert NemecAlbert Nemec
1461310
1461310
"My phone resolution is 2196x1080, therefore correct ratio should be 2:1." - The camera ratio is not necessarily the same size as the device screen ratio. Take a look at your native camera app - does it have a status bar? Does it have space for the button used to take the picture? If yes to either of these, then that explains the discepency between your phone display resolution and your camera resolution.
– markmoxx
Dec 12 '18 at 14:41
add a comment |
"My phone resolution is 2196x1080, therefore correct ratio should be 2:1." - The camera ratio is not necessarily the same size as the device screen ratio. Take a look at your native camera app - does it have a status bar? Does it have space for the button used to take the picture? If yes to either of these, then that explains the discepency between your phone display resolution and your camera resolution.
– markmoxx
Dec 12 '18 at 14:41
"My phone resolution is 2196x1080, therefore correct ratio should be 2:1." - The camera ratio is not necessarily the same size as the device screen ratio. Take a look at your native camera app - does it have a status bar? Does it have space for the button used to take the picture? If yes to either of these, then that explains the discepency between your phone display resolution and your camera resolution.
– markmoxx
Dec 12 '18 at 14:41
"My phone resolution is 2196x1080, therefore correct ratio should be 2:1." - The camera ratio is not necessarily the same size as the device screen ratio. Take a look at your native camera app - does it have a status bar? Does it have space for the button used to take the picture? If yes to either of these, then that explains the discepency between your phone display resolution and your camera resolution.
– markmoxx
Dec 12 '18 at 14:41
add a comment |
2 Answers
2
active
oldest
votes
On Samsung S9, the screen aspect ratio of 18.5:9
is very close to 2:1
. And if you don't hide the navigation bar, the area devoted to your camera preview is probably even closer to the suported 2:1
.
But if you want this to work on all devices with their different screen aspect ratios and different supported camera aspect ratios, you must crop the preview to your window, see e.g. https://github.com/waitopiggu/rn-camera-android-cropping-test.
As for choosing the best camera aspect ratio, you are right that exact match may not be acvailable; let's find the one that is closest to what we want:
const wantedRatio = height/width
var bestRatio = 0;
var bestRatioError = 100000;
for (i in ratios) {
const r = ratios[i].split(":")
if (abs(wantedRatio - r[0]/r[1]) < bestRatioError) {
bestRatioError = abs(wantedRatio - r[0]/r[1])
bestRatio = ratios[i]
}
}
this.setState({
bestRatio
})
I'm sure the idea is good, but the code doesn't work. For exampler
is an Array and you're trying to subtract it fromwantedRatio
which is a number. Could you please fix it?
– Albert Nemec
Nov 25 '18 at 23:26
Oops, that's what happens wihen trying to copy/paste and clean up in the same time ;)
– Alex Cohn
Nov 25 '18 at 23:33
add a comment |
Firstly get device dimension(resolution、ration) using https://facebook.github.io/react-native/docs/dimensions.
Then you could try this:
import React from 'react';
import {
Platform
} from 'react-native';
import {
RNCamera
} from 'react-native-camera';
const DESIRED_RATIO = "2:1"; //suppose the result of first step is 2:1
class MyCameraComponent extends Component {
state = {}
prepareRatio = async () => {
if (Platform.OS === 'android' && this.cam) {
const ratios = await this.cam.getSupportedRatiosAsync();
// See if the current device has your desired ratio, otherwise get the maximum supported one
// Usually the last element of "ratios" is the maximum supported ratio
const ratio = ratios.find((ratio) => ratio === DESIRED_RATIO) || ratios[ratios.length - 1];
this.setState({
ratio
});
}
}
render() {
return ( <
RNCamera ref = {
(cam) => this.cam = cam
}
onCameraReady = {
this.prepareRatio
} // You can only get the supported ratios when the camera is mounted
ratio = {
this.state.ratio
}
/>
);
}
}
The step two I'm familiar with. It's the step one that's bugs me. I can writeheight / width
function, that'd give me the ratio. But for example my screen is not exactly 2:1.. it's smthg like 2.1:1 or some hell like that.
– Albert Nemec
Nov 25 '18 at 14:08
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53467776%2freact-native-android-get-devices-ratio%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
On Samsung S9, the screen aspect ratio of 18.5:9
is very close to 2:1
. And if you don't hide the navigation bar, the area devoted to your camera preview is probably even closer to the suported 2:1
.
But if you want this to work on all devices with their different screen aspect ratios and different supported camera aspect ratios, you must crop the preview to your window, see e.g. https://github.com/waitopiggu/rn-camera-android-cropping-test.
As for choosing the best camera aspect ratio, you are right that exact match may not be acvailable; let's find the one that is closest to what we want:
const wantedRatio = height/width
var bestRatio = 0;
var bestRatioError = 100000;
for (i in ratios) {
const r = ratios[i].split(":")
if (abs(wantedRatio - r[0]/r[1]) < bestRatioError) {
bestRatioError = abs(wantedRatio - r[0]/r[1])
bestRatio = ratios[i]
}
}
this.setState({
bestRatio
})
I'm sure the idea is good, but the code doesn't work. For exampler
is an Array and you're trying to subtract it fromwantedRatio
which is a number. Could you please fix it?
– Albert Nemec
Nov 25 '18 at 23:26
Oops, that's what happens wihen trying to copy/paste and clean up in the same time ;)
– Alex Cohn
Nov 25 '18 at 23:33
add a comment |
On Samsung S9, the screen aspect ratio of 18.5:9
is very close to 2:1
. And if you don't hide the navigation bar, the area devoted to your camera preview is probably even closer to the suported 2:1
.
But if you want this to work on all devices with their different screen aspect ratios and different supported camera aspect ratios, you must crop the preview to your window, see e.g. https://github.com/waitopiggu/rn-camera-android-cropping-test.
As for choosing the best camera aspect ratio, you are right that exact match may not be acvailable; let's find the one that is closest to what we want:
const wantedRatio = height/width
var bestRatio = 0;
var bestRatioError = 100000;
for (i in ratios) {
const r = ratios[i].split(":")
if (abs(wantedRatio - r[0]/r[1]) < bestRatioError) {
bestRatioError = abs(wantedRatio - r[0]/r[1])
bestRatio = ratios[i]
}
}
this.setState({
bestRatio
})
I'm sure the idea is good, but the code doesn't work. For exampler
is an Array and you're trying to subtract it fromwantedRatio
which is a number. Could you please fix it?
– Albert Nemec
Nov 25 '18 at 23:26
Oops, that's what happens wihen trying to copy/paste and clean up in the same time ;)
– Alex Cohn
Nov 25 '18 at 23:33
add a comment |
On Samsung S9, the screen aspect ratio of 18.5:9
is very close to 2:1
. And if you don't hide the navigation bar, the area devoted to your camera preview is probably even closer to the suported 2:1
.
But if you want this to work on all devices with their different screen aspect ratios and different supported camera aspect ratios, you must crop the preview to your window, see e.g. https://github.com/waitopiggu/rn-camera-android-cropping-test.
As for choosing the best camera aspect ratio, you are right that exact match may not be acvailable; let's find the one that is closest to what we want:
const wantedRatio = height/width
var bestRatio = 0;
var bestRatioError = 100000;
for (i in ratios) {
const r = ratios[i].split(":")
if (abs(wantedRatio - r[0]/r[1]) < bestRatioError) {
bestRatioError = abs(wantedRatio - r[0]/r[1])
bestRatio = ratios[i]
}
}
this.setState({
bestRatio
})
On Samsung S9, the screen aspect ratio of 18.5:9
is very close to 2:1
. And if you don't hide the navigation bar, the area devoted to your camera preview is probably even closer to the suported 2:1
.
But if you want this to work on all devices with their different screen aspect ratios and different supported camera aspect ratios, you must crop the preview to your window, see e.g. https://github.com/waitopiggu/rn-camera-android-cropping-test.
As for choosing the best camera aspect ratio, you are right that exact match may not be acvailable; let's find the one that is closest to what we want:
const wantedRatio = height/width
var bestRatio = 0;
var bestRatioError = 100000;
for (i in ratios) {
const r = ratios[i].split(":")
if (abs(wantedRatio - r[0]/r[1]) < bestRatioError) {
bestRatioError = abs(wantedRatio - r[0]/r[1])
bestRatio = ratios[i]
}
}
this.setState({
bestRatio
})
edited Nov 25 '18 at 23:32
answered Nov 25 '18 at 21:17
Alex CohnAlex Cohn
41.7k553191
41.7k553191
I'm sure the idea is good, but the code doesn't work. For exampler
is an Array and you're trying to subtract it fromwantedRatio
which is a number. Could you please fix it?
– Albert Nemec
Nov 25 '18 at 23:26
Oops, that's what happens wihen trying to copy/paste and clean up in the same time ;)
– Alex Cohn
Nov 25 '18 at 23:33
add a comment |
I'm sure the idea is good, but the code doesn't work. For exampler
is an Array and you're trying to subtract it fromwantedRatio
which is a number. Could you please fix it?
– Albert Nemec
Nov 25 '18 at 23:26
Oops, that's what happens wihen trying to copy/paste and clean up in the same time ;)
– Alex Cohn
Nov 25 '18 at 23:33
I'm sure the idea is good, but the code doesn't work. For example
r
is an Array and you're trying to subtract it from wantedRatio
which is a number. Could you please fix it?– Albert Nemec
Nov 25 '18 at 23:26
I'm sure the idea is good, but the code doesn't work. For example
r
is an Array and you're trying to subtract it from wantedRatio
which is a number. Could you please fix it?– Albert Nemec
Nov 25 '18 at 23:26
Oops, that's what happens wihen trying to copy/paste and clean up in the same time ;)
– Alex Cohn
Nov 25 '18 at 23:33
Oops, that's what happens wihen trying to copy/paste and clean up in the same time ;)
– Alex Cohn
Nov 25 '18 at 23:33
add a comment |
Firstly get device dimension(resolution、ration) using https://facebook.github.io/react-native/docs/dimensions.
Then you could try this:
import React from 'react';
import {
Platform
} from 'react-native';
import {
RNCamera
} from 'react-native-camera';
const DESIRED_RATIO = "2:1"; //suppose the result of first step is 2:1
class MyCameraComponent extends Component {
state = {}
prepareRatio = async () => {
if (Platform.OS === 'android' && this.cam) {
const ratios = await this.cam.getSupportedRatiosAsync();
// See if the current device has your desired ratio, otherwise get the maximum supported one
// Usually the last element of "ratios" is the maximum supported ratio
const ratio = ratios.find((ratio) => ratio === DESIRED_RATIO) || ratios[ratios.length - 1];
this.setState({
ratio
});
}
}
render() {
return ( <
RNCamera ref = {
(cam) => this.cam = cam
}
onCameraReady = {
this.prepareRatio
} // You can only get the supported ratios when the camera is mounted
ratio = {
this.state.ratio
}
/>
);
}
}
The step two I'm familiar with. It's the step one that's bugs me. I can writeheight / width
function, that'd give me the ratio. But for example my screen is not exactly 2:1.. it's smthg like 2.1:1 or some hell like that.
– Albert Nemec
Nov 25 '18 at 14:08
add a comment |
Firstly get device dimension(resolution、ration) using https://facebook.github.io/react-native/docs/dimensions.
Then you could try this:
import React from 'react';
import {
Platform
} from 'react-native';
import {
RNCamera
} from 'react-native-camera';
const DESIRED_RATIO = "2:1"; //suppose the result of first step is 2:1
class MyCameraComponent extends Component {
state = {}
prepareRatio = async () => {
if (Platform.OS === 'android' && this.cam) {
const ratios = await this.cam.getSupportedRatiosAsync();
// See if the current device has your desired ratio, otherwise get the maximum supported one
// Usually the last element of "ratios" is the maximum supported ratio
const ratio = ratios.find((ratio) => ratio === DESIRED_RATIO) || ratios[ratios.length - 1];
this.setState({
ratio
});
}
}
render() {
return ( <
RNCamera ref = {
(cam) => this.cam = cam
}
onCameraReady = {
this.prepareRatio
} // You can only get the supported ratios when the camera is mounted
ratio = {
this.state.ratio
}
/>
);
}
}
The step two I'm familiar with. It's the step one that's bugs me. I can writeheight / width
function, that'd give me the ratio. But for example my screen is not exactly 2:1.. it's smthg like 2.1:1 or some hell like that.
– Albert Nemec
Nov 25 '18 at 14:08
add a comment |
Firstly get device dimension(resolution、ration) using https://facebook.github.io/react-native/docs/dimensions.
Then you could try this:
import React from 'react';
import {
Platform
} from 'react-native';
import {
RNCamera
} from 'react-native-camera';
const DESIRED_RATIO = "2:1"; //suppose the result of first step is 2:1
class MyCameraComponent extends Component {
state = {}
prepareRatio = async () => {
if (Platform.OS === 'android' && this.cam) {
const ratios = await this.cam.getSupportedRatiosAsync();
// See if the current device has your desired ratio, otherwise get the maximum supported one
// Usually the last element of "ratios" is the maximum supported ratio
const ratio = ratios.find((ratio) => ratio === DESIRED_RATIO) || ratios[ratios.length - 1];
this.setState({
ratio
});
}
}
render() {
return ( <
RNCamera ref = {
(cam) => this.cam = cam
}
onCameraReady = {
this.prepareRatio
} // You can only get the supported ratios when the camera is mounted
ratio = {
this.state.ratio
}
/>
);
}
}
Firstly get device dimension(resolution、ration) using https://facebook.github.io/react-native/docs/dimensions.
Then you could try this:
import React from 'react';
import {
Platform
} from 'react-native';
import {
RNCamera
} from 'react-native-camera';
const DESIRED_RATIO = "2:1"; //suppose the result of first step is 2:1
class MyCameraComponent extends Component {
state = {}
prepareRatio = async () => {
if (Platform.OS === 'android' && this.cam) {
const ratios = await this.cam.getSupportedRatiosAsync();
// See if the current device has your desired ratio, otherwise get the maximum supported one
// Usually the last element of "ratios" is the maximum supported ratio
const ratio = ratios.find((ratio) => ratio === DESIRED_RATIO) || ratios[ratios.length - 1];
this.setState({
ratio
});
}
}
render() {
return ( <
RNCamera ref = {
(cam) => this.cam = cam
}
onCameraReady = {
this.prepareRatio
} // You can only get the supported ratios when the camera is mounted
ratio = {
this.state.ratio
}
/>
);
}
}
answered Nov 25 '18 at 13:34
navylovernavylover
3,51031119
3,51031119
The step two I'm familiar with. It's the step one that's bugs me. I can writeheight / width
function, that'd give me the ratio. But for example my screen is not exactly 2:1.. it's smthg like 2.1:1 or some hell like that.
– Albert Nemec
Nov 25 '18 at 14:08
add a comment |
The step two I'm familiar with. It's the step one that's bugs me. I can writeheight / width
function, that'd give me the ratio. But for example my screen is not exactly 2:1.. it's smthg like 2.1:1 or some hell like that.
– Albert Nemec
Nov 25 '18 at 14:08
The step two I'm familiar with. It's the step one that's bugs me. I can write
height / width
function, that'd give me the ratio. But for example my screen is not exactly 2:1.. it's smthg like 2.1:1 or some hell like that.– Albert Nemec
Nov 25 '18 at 14:08
The step two I'm familiar with. It's the step one that's bugs me. I can write
height / width
function, that'd give me the ratio. But for example my screen is not exactly 2:1.. it's smthg like 2.1:1 or some hell like that.– Albert Nemec
Nov 25 '18 at 14:08
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53467776%2freact-native-android-get-devices-ratio%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
"My phone resolution is 2196x1080, therefore correct ratio should be 2:1." - The camera ratio is not necessarily the same size as the device screen ratio. Take a look at your native camera app - does it have a status bar? Does it have space for the button used to take the picture? If yes to either of these, then that explains the discepency between your phone display resolution and your camera resolution.
– markmoxx
Dec 12 '18 at 14:41