RN ๋ฌธ์ : RN 0.57.x ๋ฒ๋ค๋ก ์ ๊ณต๋๋ ํฐ ์ด๋ฏธ์ง๋ \๋ฅผ ์ฌ์ฉํ์ฌ ๋ณผ ๋ ํ์ง์ด ๋ฎ์ต๋๋ค.
Android์์๋ง ๋์ฉ๋ ๋ฒ๋ค(PNG, GIF ๋ฐ ๊ธฐํ ํ์, JPEG ์๋) ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ๋ ํ์ง์ด ๋ฎ์ต๋๋ค.
์ผ์ชฝ ์คํฌ๋ฆฐ์ท์์ RN 0.56.0์ผ๋ก ์คํ๋๋ ๋๊ฐ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ค๋ฅธ์ชฝ ์คํฌ๋ฆฐ์ท์์ RN 0.57.1์ ๋ด
๋๋ค . ์ฝ๋๋ ๋จ์ํ ์ด๋ฏธ์ง <Image source={require('./assets/ELHall1.png')} resizeMethod="resize" />
์ด๊ณ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ 2111 x 4645 pixels
์
๋๋ค. ๋ ํ๋ก์ ํธ ๋ชจ๋ react-native init RN057ImageTest
๋ฐ react-native init --version="0.56.0" RN056ImageTest
์ฌ์ฉํ์ฌ ์๋ก ์ค์น๋์์ต๋๋ค. ์ด๊ฒ์ 0.56 ๋ฐ ์ต์ RN 0.60.x ์ดํ์ ๋ชจ๋ ๋ฒ์ ์์ ๊ณ์ ๋ฐ์ํฉ๋๋ค.
์ด๊ฒ์ RN Fresco lib๊ฐ 1.9.0์์ 1.10.0์ผ๋ก 0.56๊ณผ 0.57 ์ฌ์ด์์ ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ํ์ธ๋์์ต๋๋ค. ๋๊ธ ํ์ธ https://github.com/facebook/react-native/issues/21301#issuecomment-520155609.
Fresco ๋ฌธ์ ์์ ๊ฒ์ํ ํ ํฐ ์ด๋ฏธ์ง๋ฅผ ์กฐ๊ฐ ๋จ์๋ก ๋๋๊ณ ์ฌ๊ตฌ์ฑํด์ผ ํ๋ค๋ ๋ช ๊ฐ์ง ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ๋ง์ ๊ฒฝ์ฐ(๋๋ถ๋ถ์ ์ง๋ ๊ด๋ จ ํฐ ์ด๋ฏธ์ง)๋ฅผ ํด๊ฒฐํ์ง๋ง ํนํ ๋์ ๋ก๋์ ๊ฒฝ์ฐ ๋งค์ฐ ๋ถํธํ ์ ์์ต๋๋ค. /๋ง๋ ์ด๋ฏธ์ง. ์ด๊ฒ์ RN 0.56๊น์ง ๊ทธ๋ฆฌ๊ณ 0.57๋ถํฐ ์๋ํ์ผ๋ฉฐ ๊ทธ ์ดํ์๋ ์๋ํ์ง ์์ต๋๋ค.
RN: <Image/>
๊ตฌ์ฑ ์์๊ฐ ์ถ๊ฐ๋ ์ด๊ธฐ App.js
์
๋๋ค.
...
type Props = {};
export default class App extends Component<Props> {
render() {
return (
<View style={styles.container}>
<Image source={require('./assets/ELHall1.png')} resizeMethod="resize" />
</View>
);
}
}
...
์ด ๋๊ธ https://github.com/facebook/react-native/issues/21301#issuecomment-520418832์์ lambdapioneer ๋ ์ด๊ฒ์ด ํฐ ์ด๋ฏธ์ง ์ถ์(ํ์ ์ํ๋ง)์ ๊ด๋ จ์ด ์์ ์
Fresco๊ฐ ํฐ ์ด๋ฏธ์ง๋ฅผ ์ถ์(ํ์ ์ํ๋ง)ํ๋ ๋ฐฉ๋ฒ(๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฑ๋ฅ ๋ฌธ์ ์ ์ค์ํ ๊ธฐ๋ฅ์)๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ ๊ธฐ๊ฐ ๋์ .so unsatisfied ๋งํฌ ์ค๋ฅ๋ฅผ ๋๋ฅด๋ ๊ฒ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋๋ก ๊ธฐ๋ณธ ์ฝ๋ ์ข ์์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด ์ด ์์ญ์ ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ด ์์์ต๋๋ค. ๋งํ์๋ฉด, ๋ ๋ค๋ฅธ ๋๊ท๋ชจ ๊ฐ์ ์ ๋ถ์์ฉ์ผ ์ ์์ต๋๋ค.
์๋ ํ์ธ์, ์ต๊ทผ์ ์ด ๋ฌธ์ ์ ๋ํ ํ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์ ๊ด์ฌ์ด ํ์ํ๊ฐ์? ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋ ์ ์์ต๋๋ค. ๋ํ ์ด ๋ฌธ์ ์ "๋ฒ๊ทธ" ๋๋ "ํฅ์" ๋ ์ด๋ธ์ ๋ถ์ผ ์ ์์ผ๋ฉฐ ์ ๋ ๊ทธ๋๋ก ๋ก๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
RN 0.56.0 ๋ฐ 0.57.1์ ์ด๋ค Fresco ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ์ด๋ ๊ฒ ํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์ปค๋ฐ ์๊ฐ ์ค์ด๋ญ๋๋ค.
์๋ ํ์ธ์ @oprisnik ๋ ,
https://github.com/facebook/react-native/issues/21301#issuecomment -520155609๊ฐ ์ ํํ ๋ณด๊ณ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ฌ๋ฌด์ค๋ก ๋์์ฌ ๋ ์ด๋ค ๋ฒ์ ํจ์น๊ฐ ์ ๊ทธ๋ ์ด๋๋์๋์ง ์ ํํ ํ์ธํ๊ณ ํ์ธํ ๊ฒ์ ๋๋ค. ์ด๋ค ๋ฒ์ ์์ ์ด ๋์์ด ๋ณ๊ฒฝ๋์๋์ง ํ์ธํฉ๋๋ค.
์๋
ํ์ธ์ @clytras , ์ด ์ ์ฅ์ ์์ ํ๋ฉด ์ ์ด๋ฏธ์ง ๋ฅผ ์ฐพ์ ์ต๋๋ค .
๋๋ ๊ทธ๋ฆผ์ ๋ค์ด๋ก๋ํ๊ณ ๊ทธ๋ฆผ์ด 2111(๋๋น)*4645(๋์ด)์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
Fresco๋ OpenGL ์ ํ์ ๋ง๊ฒ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด์ํ๋งํฉ๋๋ค. ๊ธฐ๋ณธ ์ด๋ฏธ์ง์ ์ต๋ ๋๋น/๋์ด๋ ์ด ์ค์ ํ๋์ฝ๋์ ๋๋ค.
๋ด ์๊ฐ์,
์ฌ์ด ๋ฐฉ๋ฒ์ ResizeOption์ maxBitmapSize ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์
๋๋ค.
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ Fresco๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ํฐ ์ด๋ฏธ์ง๋ฅผ ํ์ํ์ง ์๋ ๊ฒ์
๋๋ค.
๋ค๋ฅธ ์์ ฏ์ ๋ง๋ค๊ณ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ํฐ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ง์ Android ํ์ ์ ํ์ ๋๋ค.
@s1rius ์๋ ํ์ธ์, ๊ณต๊ฐ๋ ๋ฌธ์ ๊ฒ์๋ฌผ์ ์ฝ์ผ๋ฉด ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ ํํ๊ฒ ์๋๋ค.
์ฝ๋๋ ๋จ์ํ ์ด๋ฏธ์ง์ผ ๋ฟ์ ๋๋ค
์ด๋ฏธ์ง ํฌ๊ธฐ๋ 2111 x 4645ํฝ์ ์ ๋๋ค.
์ด๊ฒ์ Fresco 1.9.0์์ 1.10.0์ผ๋ก ๋ณ๊ฒฝ๋ RN >= 0.57์์ ๋ฐ์ํ ๋์ ๋ณ๊ฒฝ์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ทธ์ ๊ฐ์ ํฐ ์ด๋ฏธ์ง๋ ํด๋น ๋ฒ์ ์ด์ ์ ์ ์ฒด ํ์ง๋ก ์๋ํ๊ณ ๋ก๋๋์์ต๋๋ค. RN repo์ ๊ธฐ๊ณ ์๋ค์ ์ด๊ฒ์ด RN ๋ฌธ์ ๊ฐ ์๋๋ผ Fresco lib ๋ฌธ์ ๋ผ๊ณ ๋งํ๋ฉด์ ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ์ต๋๋ค. ์๋์ ์ผ๋ก ํ๋์ ๋ณ๊ฒฝํ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ์ ์์ต๋๋ค. ์, ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์ด๊ฒ์ด ๋ฒ์ ๊น์ง ์๋ํ๋ค๊ฐ ๊ฐ์๊ธฐ ์ด์ ์ ๋ํ ์ ๋ณด ์์ด ์๋์ด ์ค์ง๋์๋ค๋ ๊ฒ์ ๋๋ค.
์๋ ํ์ธ์, ์ต๊ทผ์ ์ด ๋ฌธ์ ์ ๋ํ ํ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์ ๊ด์ฌ์ด ํ์ํ๊ฐ์? ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋ ์ ์์ต๋๋ค. ๋ํ ์ด ๋ฌธ์ ์ "๋ฒ๊ทธ" ๋๋ "ํฅ์" ๋ ์ด๋ธ์ ๋ถ์ผ ์ ์์ผ๋ฉฐ ์ ๋ ๊ทธ๋๋ก ๋ก๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ฅ๊ธฐ๊ฐ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ์ต์ ๋ฆด๋ฆฌ์ค์ ์ฌ์ ํ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ต์ ์ ๋ณด๋ก ์ธ์ ๋ ์ง ๋ค์ ์ฌ์ญ์์ค.
์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์ ์ฌ์ ์ธ ๋ณ๊ฒฝ ์ฌํญ์ https://github.com/facebook/fresco/commit/fa71901055a38a810c190862c7fd582fd3dad2b3์ ๋๋ค.
๋ฌธ์ ๊ฐ ๋๋ ๋ณ๊ฒฝ ์ฌํญ์ธ์ง ํ์ธํ ์ ์์ต๋๊น?
@oprisnik ๋ค์ ํ ๋ฒ ์๋ ํ์ธ์. ์ด ๋ฌธ์ ๋ฅผ ์กฐ์ฌํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋๋ Gradle๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ๋ ๋์ ์์ค์์ ์ง์ ํ๋ ์ค์ฝ๋ฅผ ์ปดํ์ผํ๋๋ก RN์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ์ต์ํ์ง ์์ต๋๋ค. ๋ด๊ฐ ์ฑ๊ณตํ์ง ๋ชปํ ๋จ๊ณ:
react-native-cli
์ฌ์ฉํ์ฌ RN 0.57 ํ๋ก์ ํธ ์์ฑv1.10.0
๋ถ๊ธฐ๋ก ์ฒดํฌ์์android-ndk-r20
์ ๊ฒฝ๋ก๋ฅผ <Project>\android\local.properties
( ndk.dir=G:\\Dev\\Android\\android-ndk-r20
)๊ทธ๋ฐ ๋ค์ ์์ค์์ ํ๋ ์ค์ฝ๋ก RN์ ์ปดํ์ผํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ ์ํ๋ SO https://stackoverflow.com/a/52861379/1889685 ์์ ์ด ๋ต๋ณ์ ์ฐพ์์ต๋๋ค.
cd android
./gradlew assembleDebug --include-build /e/Sandbox/RN057ImageTest/fresco/
ํ์ง๋ง ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
> Task :fresco:imagepipeline:ndk_build_bitmaps FAILED
A problem was found with the configuration of task ':fresco:imagepipeline:ndk_build_bitmaps'. Registering invalid inputs and outputs via TaskInputs and TaskOutputs methods has been deprecated and is scheduled to be removed in Gradle 5.0.
- File 'E:\Sandbox\RN057ImageTest\fresco\imagepipeline\src\main\jni\bitmaps' specified for property '$1' is not a file.
@sunnylqm ์ ์ด ํ๋ก์ธ์ค์ ๋ ์ต์ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์๋ค๋ฉด ์ด๊ฒ์ ํ ์คํธํ ์ ์์ต๋๋ค.
๋์์ด ๋๋ค๋ฉด ์ง๊ธ๊น์ง ๊ฐ์ง๊ณ ์๋ ๊ฒ์ผ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์๋ ํ์ธ์, ์ต๊ทผ์ ์ด ๋ฌธ์ ์ ๋ํ ํ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์ ๊ด์ฌ์ด ํ์ํ๊ฐ์? ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋ ์ ์์ต๋๋ค. ๋ํ ์ด ๋ฌธ์ ์ "๋ฒ๊ทธ" ๋๋ "ํฅ์" ๋ ์ด๋ธ์ ๋ถ์ผ ์ ์์ผ๋ฉฐ ์ ๋ ๊ทธ๋๋ก ๋ก๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋น๋๋ฅผ ์๋ํ์ง๋ง ndk ์ค๋ฅ๋ ๋ฐ์ํ์ต๋๋ค. ํ ์คํธํ ์ ์๋ ์ผ๊ฐ ๋น๋๊ฐ ์์ต๋๊น?
v2.0.0์ ์์ ์์ด ์ปดํ์ผํ ์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ธ์ ์๋ํ์ต๋๋ค. ์์ ์ปค๋ฐ์ ์ํด ํ์ฑํ๋ ๋ค์ด์ํ๋ง ์ ๋นํ์ฑํํ์ผ๋ฉฐ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ
์คํธ ์ด๋ฏธ์ง URI:
" https://wagonsclub.oss-cn-beijing.aliyuncs.com/static/carousel/carousel1_bg.jpg "
fragment_drawee_simple.xml
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/drawee_view"
android:layout_width="match_parent"
android:layout_height="1000dp"
/>
์๋ v2.0.0 ์ผ์ผ์ด์ค
๋นํ์ฑํ๋ ๋ค์ด์ํ๋ง v2.0.0 ์ผ์ผ์ด์ค
@sunnylqm ๋๋ฒ๊น
MainApplication.java
onCreate
:
<strong i="10">@Override</strong>
public void onCreate() {
super.onCreate();
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
.setDownsampleEnabled(false)
.build();
Fresco.initialize(this, config);
SoLoader.init(this, /* native exopackage */ false);
}
์ด๊ฒ์ผ๋ก ๋๋ Fresco๊ฐ ์ด๋ฏธ ์ด๊ธฐํ๋์๋ค๋ ๋ฉ์์ง๋ฅผ Logcat์์ ๋ฐ์ต๋๋ค.
MainReactPackage
๋ก MainPackageConfig
MainReactPackage
๋ฅผ ์ด๊ธฐํํ์ฌ ์ฌ์ฉํ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด์ง๋ง ์๋ํ์ง ์์์ต๋๋ค.
protected List<ReactPackage> getPackages() {
Context context = getApplicationContext();
ImagePipelineConfig pipelineConfig = ImagePipelineConfig
.newBuilder(context.getApplicationContext())
.setDownsampleEnabled(false)
.build();
MainPackageConfig config = new MainPackageConfig.Builder().setFrescoConfig(pipelineConfig).build();
return new ArrayList<>(Arrays.<ReactPackage>asList(
new MainReactPackage(config),
new ReactNativeFirebaseAppPackage(),
new FastImageViewPackage(),
new RNGestureHandlerPackage(),
new ReanimatedPackage(),
new SvgPackage()
));
}
@clytras ๋๋ ๋ชจ๋ฅธ๋ค. ์์ค ์ฝ๋์์ ๋นํ์ฑํํ์ต๋๋ค.
ํ @oprisnik
(๊ฐ) ๊ธฐ๋ณธ ๊ธฐ๋ณธ ํจํค์ง์ ๊ตฌ์ฑ ๋ฐ์์ ํตํด ๋ค์๊ณผ ๊ฐ์ต๋๋ค๊ฐ ์ค์ ๋ฉ๋๋ค https://github.com/facebook/react-native/blob/6c0f73b3223968448bb186b82f06f6819068a21d/ReactAndroid/src/main/java/com/facebook/react/shell/MainPackageConfig.java
RN์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ๊ณ ์๋ํ ์ ์ด ์์ต๋๋ค.
@oprisnik ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ณํ์ด ์์ต๋๊น?
๋๋ ์ด ๋ฌธ์ ๊ฐ ์ฌ์ ํ RN repo์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฏธ์ง ๋ค์ด์ํ๋ง์ ์์ฌํ ์ฌ์ง ์์ด ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ ์ค์ด๊ณ ํจ์จ์ฑ์ ๋์ด๋ฉฐ ํฐ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ๋ ํฌ๋์๋ฅผ ์ค์ด๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ์ด ๋ฌธ์ ๋ ์ต์ข ๊ฐ๋ฐ์๊ฐ ์ต์ /์์ฑ ํํ๋ก ์ด๋ฏธ์ง ๋ค์ด์ํ๋ง์ ์ํ๋์ง ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์๋ ๋ฐฉ์์ผ๋ก RN์์ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ด ์ฑ์์ ์ผ๋ถ ํ๋ฉด๋๋ฅผ ํ์ํ๊ธฐ ์ํด ํฐ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ํ๋ฉด๋๋ฅผ ํ๋ํ ๋ ๊ณ ํด์๋๊ฐ ํ์ํฉ๋๋ค. ๋๋ ํญ์ ์ฅ์น ๊ธฐ๋ฅ์ ํ์ธํ๊ณ RAM์ด ์ ๊ฑฐ๋ ์ ํด์๋๊ฐ ์๋ ์ ๊ฐํ ์ฅ์น์ธ ๊ฒฝ์ฐ ๋ ์๊ณ ์ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํฉ๋๋ค.
scale
๋ฐ resize
์๋ <Image/>
๊ตฌ์ฑ ์์์ ๋ํ resizeMethod
์์ฑ์ด ์์ต๋๋ค. RN ํ์ฌ๋ ํด๋น ์์ฑ์ scale
๊ฐ์ ์กด์คํ์ง ์์ผ๋ฏ๋ก ์ด๋ฏธ์ง ๋ค์ด์ํ๋ง์ ๋นํ์ฑํํ๊ณ resize
์ค์ ํ ๋๋ง ํ์ฑํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
resizeMethod
์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ ์ด๋ฏธ์ง ๋ณด๊ธฐ์ ํฌ๊ธฐ์ ๋ค๋ฅผ ๋ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉํด์ผ ํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์๋์ ๋๋ค.
resize
: ๋์ฝ๋ฉ๋๊ธฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ธ์ฝ๋ฉ๋ ์ด๋ฏธ์ง๋ฅผ ๋ณ๊ฒฝํ๋ ์ํํธ์จ์ด ์์ ์ ๋๋ค. ์ด๋ฏธ์ง๊ฐ ๋ณด๊ธฐ๋ณด๋ค ํจ์ฌ ํด ๋scale
๋์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
scale
: ์ด๋ฏธ์ง๊ฐ ์ถ์ ๋๋ ํ๋๋์ด ๊ทธ๋ ค์ง๋๋ค.resize
๋นํดscale
๋ ๋ ๋น ๋ฅด๊ณ (์ผ๋ฐ์ ์ผ๋ก ํ๋์จ์ด ๊ฐ์) ๋ ๋์ ํ์ง์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฏธ์ง๊ฐ ๋ณด๊ธฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ฏธ์ง๊ฐ ๋ณด๊ธฐ๋ณด๋ค ์ฝ๊ฐ ํฐ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@oprisnik @sunnylqm์ ๋ํ ๊ทํ์ ์๊ฐ์ ์ ๋ง ๋ณด๊ณ ์ถ์ต๋๋ค.
@clytras ๋ง์ํ์ ๋๋ก ํ๋ ์ค์ฝ์์ ์ค๋ช ์ด ์๋ ๋์ ๋ณ๊ฒฝ์ ๋๋ค. (์ ๊ฐ ๋ณด์ฌ์ฃผ๋ ๋ฐ๋ชจ๋ fresco repo์ ์์ ์ฑ์ ๋๋ค) ๊ทธ๋์ RN๊ณผ ์๋ฌด ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@sunnylqm ๋ฌผ๋ก ์ค๋ช ์์ด ํ๋ ์ค์ฝ์ ๋์ ๋ณ๊ฒฝ์ด์ง๋ง RN์ ์ด ํ๋ ์ค์ฝ ๊ธฐ๋ฅ์ ํ์ฑํ/๋นํ์ฑํํ๋ ์ ํ์ ์ต์ข ๊ฐ๋ฐ์์๊ฒ ๋งก๊ฒจ์ผ ํฉ๋๋ค.
๋ํ ์ด๋ฌํ ๋์ ๋ณ๊ฒฝ์ iOS์์๋ ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก ์ด์ ๋ํด ์กฐ์น๋ฅผ ์ทจํด์ผ ํ๊ณ ํ๋ ์ค์ฝ ๊ตฌ์ฑ์ ๋ฐ์ ๋ค์ดํฐ๋ธ์์ ๋ฐ์ํ๋ฏ๋ก ์ด ๊ตฌ์ฑ์ ์ต์ข RN ๊ฐ๋ฐ์์๊ฒ ๊ณต๊ฐํด์ผ ํ๋ค๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
BTW ์ต์ RN 0.61.2๋ก Fresco 2.0.0(๋ง์คํฐ ๋ธ๋์น)์ ์ปดํ์ผํ๊ณ DecodeProducer.java ์์ ๋ค์ด์ํ๋ง ์กฐ๊ฑด ๊ฒ์ฌ๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ์ฌ ๋ค์ด์ํ๋ง์ ๋นํ์ฑํํ์ต๋๋ค.
fresco repo ๋๋ ํ ๋ฆฌ ์์ local.properties
ํ์ผ์ ๋ง๋ค๊ณ Windows 64๋นํธ์ฉ Android NDK Revision 19c x86_64 ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
ndk.dir=G:\\Dev\\Android\\android-ndk-r19c
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
Fresco ๋ฐ์ด๋๋ฆฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ปดํ์ผ๋์๊ณ ๋ค์์ ์คํํ์ฌ ๋น๋๋ RN ์ฑ์ ๋ํด ์ด๋ฏธ์ง ๋ค์ด์ํ๋ง์ด ๋นํ์ฑํ๋์์ต๋๋ค.
cd android
.\gradlew assembleDebug --include-build ..\fresco\
์, ์ด์ ๋ํ ์๋ฃจ์ ์ RN ์ด๊ธฐํ ๋ก์ง์ ํตํด ๋๋ Fresco๊ฐ ์ด๊ธฐํ๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๋ค์ด์ํ๋ง์ ๋นํ์ฑํํ๋ ๊ฒ์ ๋๋ค.
@oprisnik ๊ทธ๋ฌ๋ฉด ์์ฑ๋ Android ํ๋ก์ ํธ ๋ด์์ ํ๋ ์ค์ฝ๋ฅผ ์ด๊ธฐํํ๋ ๋ ์ข๊ณ ๊นจ๋ํ๊ณ ์ฌ์ด ๋ฐฉ๋ฒ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ์ ๊ฐ ์๋ํ ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฌ์ฑํ ์ ์์์ต๋๋ค. ์ผ๋ถ ํ๋ก์ ํธ์์ MainReactPackage
๊ตฌ์ฑ์ ์ ๋ฌํ์ฌ getPackages
๋ฉ์๋ ๋ด์์ ์ด๊ธฐํํ๊ธฐ ์ํด com.facebook.imagepipeline.core.ImagePipelineConfig
, com.facebook.react.shell.MainReactPackage
๋ฐ com.facebook.react.shell.MainPackageConfig
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์์ง๋ง ๊ทธ๊ฒ์ ๋ด๊ฐ ์๋ํ ์ต์ RN 0.61์ด๋ RN 0.57์์ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
protected List<ReactPackage> getPackages() {
Context context = getApplicationContext();
ImagePipelineConfig pipelineConfig = ImagePipelineConfig
.newBuilder(context.getApplicationContext())
.setDownsampleEnabled(false)
.build();
MainPackageConfig config = new MainPackageConfig.Builder()
.setFrescoConfig(pipelineConfig)
.build();
return new ArrayList<>(Arrays.<ReactPackage>asList(
new MainReactPackage(config),
...
));
}
์๋ง๋ ๋ด๊ฐ ๊ฑฐ๊ธฐ์์ ๋ญ๊ฐ ์๋ชปํ๊ณ ์๊ณ <project>/android/app/build/generated/rncli/src/main/java/com/facebook/react/
๋๋ ํ ๋ฆฌ ์์ PackageList.java
ํ์ผ์ ์์ฑํ๋ ์๋ก์ด >= 0.60 ์ฐ๊ฒฐ ์์คํ
์์ ํ์คํ ์๋ํ์ง ์์์ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด MainReactPackage
๊ฐ ์ธ์ ์์ด ์ ๋ฌ๋์๊ณ ์๋ ์ฐ๊ฒฐ ์์คํ
์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ข
๋ฅ์ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ณด์ด์ง ์์ง๋ง fresco ๊ตฌ์ฑ์ผ๋ก MainReactPackage
๋ฅผ ์๋์ผ๋ก ์ ๋ฌํ์ฌ ์๋ํ์ง๋ง ์๋ํ์ง ์์์ต๋๋ค.
React Native์ฉ์ผ๋ก ์์ฑ๋ Android ํ๋ก์ ํธ ๋ด์์ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ์ผ๋ก fresco lib๋ฅผ ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ๊ณ ๋ฌธ์ํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
https://frescolib.org/docs/resizing.html ์ ์ฝ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด downsampling
๋ resizing
๋์ฒดํฉ๋๋ค. ๊ทธ๋์ @clytras ๋น์ ์ด ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ฝ resizeMethod๊ฐ scale๋ก ์ค์ ๋๋ค๋ฉด ๋ค์ด์ํ๋ง์ด ํ์ฑํ๋์ด์๋ ์๋ฉ๋๋ค.
RN์ ์ฝ๋๋ ๋์๊ฒ ์ฌ๋ฐ๋ฅธ ๊ฒ https://github.com/facebook/react-native/blob/aee88b6843cea63d6aa0b5879ad6ef9da4701846/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java#L505 ( ํฌ๊ธฐ ์กฐ์ /๋ค์ด์ํ๋ง์ด ์์์ ๋ํ๋ด๋ ์ด๋ฏธ์ง ํ์ดํ๋ผ์ธ์ null ๊ฐ์ ์ ๋ฌํจ)
๊ทธ๋ฌ๋ ํ๋ ์ค์ฝ์์๋ null resizeOptions https://github.com/facebook/fresco/blob/v2.0.0/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java#L158 - L169
downsampleEnabled
๋ฐ downsampleEnabledForNetwork
๊ฐ ๋ชจ๋ true์ด๋ฉด resizeOptions๊ฐ null์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ค์ด์ํ๋ง๋ฉ๋๋ค.
https://github.com/facebook/fresco/blob/master/imagepipeline-base/src/main/java/com/facebook/imagepipeline/transcoder/DownsampleUtil.java#L56
๋ฐ๋ผ์ ๋ฌธ์์ ์ฝ๋๊ฐ ์ผ์นํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํน์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด์ํ๋งํ ์ง ์ฌ๋ถ๋ฅผ ์ ์ดํ ์ ์๋ ๋ณด๋ค ์ ์ฐํ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. (์ด์ 2๊ฐ์ ์ ์ญ ๊ตฌ์ฑ์ผ๋ก ์ ์ด๋จ) @clytras @oprisnik
์๊ณ ํ์
จ์ต๋๋ค @sunnylqm. ๋๋ <Image/>
๊ตฌ์ฑ ์์์ ๋ํ RN ๊ตฌ์ฑ์ ์ฐพ๊ณ ๋ฐ๋ฅด๊ธฐ ์์ํ์ฌ ์ด๋ฌํ ๊ฒ๋ค์ ํ์ธํ๊ธฐ ์์ํ์ง๋ง ๋น์ ์ ๋๋ฅผ ๋์ด์ฐ์ต๋๋ค!
์ด๋ฌํ ๋์ ๋ณ๊ฒฝ์ด ์์ผ๋ฏ๋ก ํ๋ ์ค์ฝ๋ resizeOptions
๊ฐ null์ด ์๋ ๊ฒฝ์ฐ์๋ง ๋ค์ด์ํ๋ง์ ํ์ธํ๊ณ ์ ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. resizeMethod
๊ฐ resize
(๋๋ auto
๋ฐ ๋ก์ปฌ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ)๋ก ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์ค์ ๋๋ฉฐ https://github.com/facebook/react- ์์ ํ์ธ๋ฉ๋๋ค. shouldResize
ํจ์ ๋๋ ์ resizeMethod
๊ฐ ์์ด์ผ ํฉ๋๋ค. ํนํ ๋ค์ด์ํ๋ง์ ์ํ ์ต์
์
๋๋ค.
์๋ ํ์ธ์, ์ต๊ทผ์ ์ด ๋ฌธ์ ์ ๋ํ ํ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์ ๊ด์ฌ์ด ํ์ํ๊ฐ์? ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋ ์ ์์ต๋๋ค. ๋ํ ์ด ๋ฌธ์ ์ "๋ฒ๊ทธ" ๋๋ "ํฅ์" ๋ ์ด๋ธ์ ๋ถ์ผ ์ ์์ผ๋ฉฐ ์ ๋ ๊ทธ๋๋ก ๋ก๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@clytras ์๋ฃจ์ ์ ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
@club9822 ์ง๊ธ ์๋ฃจ์ ์ ์ฌ๊ธฐ์์ ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ ์ด๋ฏธ์ง ๋ค์ด์ํ๋ง์ ๋จผ์ ๋นํ์ฑํํ ํ ์์ค์์ ํ๋ ์ค์ฝ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ปดํ์ผํ๋ ๊ฒ์ ๋๋ค. https://github.com/facebook/fresco/issues/2397#issuecomment -541802753
ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ์ปดํ์ผํ์ง ์๊ณ ์ด์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@CaptainN ์ด ๋ฌธ์ ์ ๋ํ ์ฌ์ด ํด๊ฒฐ์ฑ ์ ์์ต๋๋ค. ์์ค๋ฅผ ์ปดํ์ผํ๋ ๊ณผ์ ์ด ํ๋ค๊ณ ์ง๋ฃจํด ๋ณด์ผ ์ ์์ง๋ง ์ค์ ๋ก๋ ์ฝ๊ฐ์ ๋ณ๊ฒฝ๊ณผ ๋ช ๋ น ์คํ์ ๋ฌธ์ ์ ๋๋ค. ์ด ๋ฌธ์ ์ ๋ด ๊ฒ์๋ฌผ์ ๋ฐ๋ผ ์ด๋ป๊ฒ ํ๋์ง ์์๋ณด์ธ์.
@clytras new PackageList(this, config)
์ ๋ ๋ฒ์งธ ์ธ์์์ config๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์์๋๋ก ์๋ํด ๋ณด์์ต๋๋ค. ๋ฌธ์ ๋ ์ฌ๊ธฐ ๋ก์ง์ด https://github.com/facebook/fresco/blob/v2.0.0/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java#L158 ๊ตฌ์ฑ์ ๋ฌด์ํ๋ค๋ ๊ฒ์
๋๋ค. -L169 false
์ด๋์ผ ํ๋๊ฑฐ ๋ง์ฃ ?
- if (mDownsampleEnabled || !statusHasFlag(status, Consumer.IS_RESIZING_DONE))
+ if (mDownsampleEnabled && !statusHasFlag(status, Consumer.IS_RESIZING_DONE))
@oprisnik
@sunnylqm ์ ๋ ์ฌ๋ฌด์ค์ ์์ด์ ์ง๊ธ ํ์ธํ ์ ์์ง๋ง ์๋ก์ด _RN >= 60_ ์๋ ๋งํฌ ์์คํ ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. ํ์คํ์ง ์์ต๋๋ค. ๋๋ฅผ ์ํด ์ด์ _RN_ ๋ฒ์ ์์๋ ์๋ํ์ง ์์์ต๋๋ค. ๋ฉฐ์น ํ์ ํด๊ฐ์์ ๋์์ฌ ๋ ํ์ธํ๊ฒ ์ต๋๋ค.
๋๋ ์ํ๊ฐ IS_RESIZING_DONE
ํ๋๊ทธ๊ฐ ์๋์ด์ mDownsampleEnabled
์์ ํ ์ฐํํ๋ ๊ฒฝ์ฐ ๋ค์ด์ํ๋ง์ด ํญ์ ์ ์ฉ๋๋ค๋ ๊ฒ์ด ๋งค์ฐ ๋ถ๋ช
ํ๊ธฐ ๋๋ฌธ์ OR ์์ AND ๋ณ๊ฒฝ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. ๋ฌผ๋ก ๋ค์ด์ํ์ ๋นํ์ฑํํ๋ ์ฌ์ฉ์ ์ง์ ํ๋ ์ค์ฝ ๊ตฌ์ฑ์ด ์ ์ฉ๋์ด ํ๋ ์ค์ฝ๋ก ์ ๋ฌ๋๋ ๊ฒฝ์ฐ์
๋๋ค.
@clytras gradle ์ฌ์ฉ ์ค๋จ ๋ฑ์ผ๋ก ๋ชจ๋ ์ข ๋ฅ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌ์ ๋น๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ๋ฆด ์ ์๋ ๊ธฐํ๊ฐ ์์ต๋๊น? (์ค์นํ ์์น๋ฅผ ์๋ ค์ฃผ์ธ์)? ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ ์์ด๋ฒ๋ ค. ๋ฌผ์ด๋ณด๋ ๊ฒ์กฐ์ฐจ ์ค๋ก์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์์๋ผ ๊ฒ์ด๊ณ , ์๋ง๋ PR์ ํ ๊ฒ์ด๋ค.
@CaptainN ๋ฌด๋กํ์ง ์์ต๋๋ค. ๋ฌธ์ ๋ ๋ด๊ฐ ๊ทธ๊ฒ์ํ๊ณ ๋ชจ๋ ์ค๋ฅ์ ์ง๋ฉดํ๊ธฐ ๋๋ฌธ์ Fresco๋ฅผ ์ค์นํ๊ณ ํจ์นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ด ํฌํจ๋ ์คํํฐ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ํจ์ฌ ์ ์ ์๊ฐ์ด ์์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ ์์ต๋๋ค: https://github.com/clytras/RN061FrescoBuild
RN 0.61.5
์์ต๋๋ค. ๋ฆฌํฌ์งํ ๋ฆฌ์๋ ์์ธํ ์ง์นจ์ด ์์ต๋๋ค. ์ด ์ฒดํฌ ์์์ ํ๋ ์ค์ฝ์, ํด๋ก v2.1.0
ํ๊ณ ํจ์น๋ฅผ ์ ์ฉ DecodeProducer.java
๊ทธ๋์ ๋ค์ด ์ํ๋ง ์ฝ๋๋ฅผ ์ฃผ์. Android NDK๋ฅผ ๋ค์ด๋ก๋ํ๊ณ libraries/fresco/local.properties
ํ์ผ์ ์ถ๊ฐํ๊ธฐ
์ง์นจ๊ณผ yarn ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ธฐ์กด RN >= 0.60(_๋๋ ์ด์ ๋ฒ์ _) ํ๋ก์ ํธ์ fresco lib๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
@clytras ์ ๋ฆฌ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ ๋ง ๊ฐ์ฌ.
์์ ์๊ฒฌ ์ด ํฅํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ธ์ง ์ฌ๋ถ์
@sunnylqm์ด ์ ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ์ต๋๋ค.
- if (mDownsampleEnabled || !statusHasFlag(status, Consumer.IS_RESIZING_DONE))
+ if (mDownsampleEnabled && !statusHasFlag(status, Consumer.IS_RESIZING_DONE))
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ณ๊ฒฝ ํ์ MainApplication.java
๋ด๋ถ์ ๊ตฌ์ฑ๋ง ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๋ค์ด์ํ๋ง์ ๋นํ์ฑํํ ์ ์์์ต๋๋ค. ์ฆ, ์๋ฌด๋ ํ๋ ์ค์ฝ๋ฅผ ์ปดํ์ผํ ํ์๊ฐ ์๊ณ ํ๋ ์ค์ฝ ์ค์ ๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
<strong i="12">@Override</strong>
protected List<ReactPackage> getPackages() {
Context context = getApplicationContext();
ImagePipelineConfig frescoConfig = ImagePipelineConfig
.newBuilder(context)
.setDownsampleEnabled(false)
.build();
MainPackageConfig appConfig = new MainPackageConfig
.Builder()
.setFrescoConfig(frescoConfig)
.build();
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this, appConfig).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
return packages;
}
ํ ๋ฒ๋ง ๋ณ๊ฒฝํ๋ฉด ์์ ๊ตฌ์ฑ ์ฝ๋๊ฐ ์๋ํ๊ณ ๋ค์ด์ํ๋ง์ด ๋นํ์ฑํ๋ฉ๋๋ค. ํด๋น ๊ตฌ์ฑ ์ .setDownsampleEnabled(true)
๋ฅผ ์ค์ ํ๋ฉด ๋ค์ด์ํ๋ง์ด ์ ๋๋ก ํ์ฑํ๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์
๋๋ค. @oprisnik. ๋ฌผ๋ก ๋์๊ฒ ์ด์์ ์ธ ๊ฒ์ RN์ด resizeMethod
๋ฅผ ์กด์คํ๊ณ ๋์ ์ผ๋ก ๋ค์ด์ํ๋ง์ ์ ์ฉํ๋ ๊ฒ์ด์ง๋ง ๊ทธ๊ฒ์ด ๊ฐ๋ฅํ์ง ํ์คํ์ง ์์ต๋๋ค.
ํธ์งํ๋ค
์ฌ์ค ๋๋ ๋ถ๋ถ์ ์ผ๋ก ํ๋ ธ๋ค. ๊ทธ ๋ณ๊ฒฝ(_์ด๊ฒ์ ์์ ํ ์๋ฏธ๊ฐ ์์)์ผ๋ก RN์ ์ฌ๊ธฐ์์ ๋ณผ ์ ์๋ ๊ฒ์ฒ๋ผ .setDownsampleEnabled(false)
๋ฅผ ์ค์ ํฉ๋๋ค. ReactAndroid/src/main/java/com/facebook/react/modules/fresco/FrescoModule.java#L155 , ๋ค์ด์ํ๋ง์ ํ์ฑํํ๋ ค๋ฉด ์์ ์ฝ๋๋ก fresco๋ฅผ ๊ตฌ์ฑํ๊ณ .setDownsampleEnabled(true)
ํฉ๋๋ค. RN์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ด์ํ๋ง์ ๋นํ์ฑํํฉ๋๋ค!
@clytras @CaptainN ์ด ๋ฌธ์ ์ ๋ํ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ Expo๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๊ฒ์ ๊ฒฝํํ๊ณ ์์ผ๋ฉฐ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ด ์ฑ์ ๊บผ๋ด์ง ์๊ณ ์๋ฃจ์ ์ ์ฐพ๊ธฐ๋ฅผ ์ ๋ง๋ก ๊ณ ๋ํ๊ณ ์์ต๋๋ค.
๋ฐ์ ๋ค์ดํฐ๋ธ CLI: 2.0.1
๋ฐ์ ๋ค์ดํฐ๋ธ: 0.61.2
์์ ์ ๋ฐ์ดํธ. ๋๋ ์ค๋ซ๋์ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋๋ถ๋ถ์ ์ด๋ฏธ์ง์ ๋ํด ๋์ผํ ์ด๋ฏธ์ง์ 3๊ฐ์ง ๋ค๋ฅธ ์ถ์ฒ( @1x , @2x , @3x)์ ์ฌ์ฉํ๋๋ก ์ ํํ๊ธฐ ๋๋ฌธ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
@enguerranws Expo๋ฅผ ์ฌ์ฉํ ๊ฒฝํ์ด ์ ํ ์์ต๋๋ค. @gorvinsky ๋ฐฉ๊ธ RN 0.61.5๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธํ๋๋ฐ ์๋ํ์ง ์์ต๋๋ค. ๋ถํํ๋ ๋ฒ๋ค ์ด๋ฏธ์ง ํฌ๊ธฐ๋ ์๋ํ์ง ์์์ต๋๋ค. ์ฒ์ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋ ํ ์คํธํ ๊ฒ์ ๋๋ค.
RN 0.61.5 ํ๋ก์ ํธ์ ์์ค์์ Fresco๋ฅผ ๋น๋ํ๋ ๋ฐ ํ์ํ ์์ ์ฌํญ์ด ์๋ react-native-community/cli ํ
ํ๋ฆฟ์ ๋ง๋ค์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์ ์ ์ ํ๋ก์ ํธ ์ด๋ฆ๊ณผ ์์ค์์ Fresco๋ฅผ ์ปดํ์ผํ๋ ๋ฐ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ ์๋ ์ RN ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ์ฝ๊ณ ๋น ๋ฅธ ๋ฐฉ๋ฒ์
๋๋ค. ๋ํ Android NDK Revision 21์ ์ฌ์ฉํ๋ฉฐ yarn 1.21
์ฌ์ฉํ์ฌ macOS ๋ฐ Windows์์ ํ
์คํธํ์ต๋๋ค.
Github ์ ์ฅ์: clytras/react-native-fresco
NPM ํ
ํ๋ฆฟ: @lytrax/react-native-fresco
๋ค์๊ณผ ๊ฐ์ด ์ค์นํ ์ ์์ต๋๋ค.
npx @react-native-community/cli<strong i="17">@next</strong> init --template=@lytrax/react-native-fresco <ProjectName>
README ์ ์์ธํ ์ค์น ์ง์นจ์ด ์์ต๋๋ค. yarn fresco-setup
์ฌ์ฉํ์ฌ Fresco๋ฅผ ๋ณต์ /ํจ์นํ ๋ค์ Android NDK๋ฅผ ์ค์นํ๊ณ Android NDK ๊ฒฝ๋ก๋ก android/libraries/fresco/local.properties
๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ด ์ปค๋ฐ์ด react-native์์ ์์ ๋๋์? (์ง๊ธ์ ์ถ์๋์ง ์์)
https://github.com/facebook/react-native/commit/f535c8b4bb4474ffe0a0765270cbca8d839deca8
์ค๋ช ์๋ "setDownsampleEnabled" ์์ฑ์ด ์๋ PipelineConfig๋ฅผ ์ ๋ฌํ ์ ์๋ค๊ณ ๋์ ์์ต๋๋ค.
@enguerranws Expo๋ฅผ ์ฌ์ฉํ ๊ฒฝํ์ด ์ ํ ์์ต๋๋ค. @gorvinsky ๋ฐฉ๊ธ RN 0.61.5๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธํ๋๋ฐ ์๋ํ์ง ์์ต๋๋ค. ๋ถํํ๋ ๋ฒ๋ค ์ด๋ฏธ์ง ํฌ๊ธฐ๋ ์๋ํ์ง ์์์ต๋๋ค. ์ฒ์ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋ ํ ์คํธํ ๊ฒ์ ๋๋ค.
RN 0.61.5 ํ๋ก์ ํธ์ ์์ค์์ Fresco๋ฅผ ๋น๋ํ๋ ๋ฐ ํ์ํ ์์ ์ฌํญ์ด ์๋ react-native-community/cli ํ ํ๋ฆฟ์ ๋ง๋ค์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์ ์ ์ ํ๋ก์ ํธ ์ด๋ฆ๊ณผ ์์ค์์ Fresco๋ฅผ ์ปดํ์ผํ๋ ๋ฐ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ ์๋ ์ RN ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ์ฝ๊ณ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ํ Android NDK Revision 21์ ์ฌ์ฉํ๋ฉฐ
yarn 1.21
์ฌ์ฉํ์ฌ macOS ๋ฐ Windows์์ ํ ์คํธํ์ต๋๋ค.Github ์ ์ฅ์: clytras/react-native-fresco
NPM ํ ํ๋ฆฟ: @lytrax/react-native-fresco๋ค์๊ณผ ๊ฐ์ด ์ค์นํ ์ ์์ต๋๋ค.
npx @react-native-community/cli<strong i="18">@next</strong> init --template=@lytrax/react-native-fresco <ProjectName>
README ์ ์์ธํ ์ค์น ์ง์นจ์ด ์์ต๋๋ค.
yarn fresco-setup
์ฌ์ฉํ์ฌ Fresco๋ฅผ ๋ณต์ /ํจ์นํ ๋ค์ Android NDK๋ฅผ ์ค์นํ๊ณ Android NDK ๊ฒฝ๋ก๋กandroid/libraries/fresco/local.properties
๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
๊ธฐ์กด ํ๋ก์ ํธ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@kalmahik
์ด ๋ฐฉ๋ฒ์ ์๋ํ์ญ์์ค. (๋ด RN์ v0.61.4์
๋๋ค)
๊ธฐ์กด ํ๋ก์ ํธ์ @clytras ' ํจ์น๋ฅผ ์ ์ฉํ๋ ๋ฐฉ์์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์ด์ ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๋๋ ํญ์ ์ค์ ์ฅ์น์์ ํ
์คํธํ๊ณ ์์ต๋๋ค. ๐ข
"fresco-clone": "git clone https://github.com/facebook/fresco.git android/libraries/fresco && cd android/libraries/fresco && git checkout tags/v2.1.0",
"fresco-patch": "yarn file-patch ./patches/DecodeProducer.java.diff android/libraries/fresco/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java",
"fresco-setup": "yarn fresco-clone && yarn fresco-patch"
'์์ฌ ํ๋ ์ค์ฝ ํจ์น'
๊ฒฐ๊ณผ
@@ -7279,32 +7279,35 @@
+//
if (mDownsampleE
@@ -7381,24 +7381,27 @@
+//
ImageReque
@@ -7460,24 +7460,27 @@
+//
if (mDowns
@@ -7513,24 +7513,27 @@
+ //
%7C%7C !U
@@ -7587,36 +7587,39 @@
+//
+
encodedImage.set
@@ -7637,32 +7637,35 @@
%0A
+ //
Downsam
@@ -7700,32 +7700,35 @@
%0A
+ //
req
@@ -7762,32 +7762,35 @@
+//
requ
@@ -7820,32 +7820,35 @@
%0A
+ //
enc
@@ -7866,32 +7866,35 @@
+//
maxB
@@ -7914,32 +7914,35 @@
+//
%7D%0A
@@ -7937,32 +7937,35 @@
+//
%7D%0A%0A
@@ -7962,24 +7962,27 @@
+ //
if (produce
@@ -8002,28 +8002,31 @@
+//
+
.getImagePip
@@ -8050,24 +8050,27 @@
+ //
.getExp
@@ -8091,24 +8091,27 @@
+ //
.should
@@ -8151,24 +8151,27 @@
+//
maybeIncre
@@ -8206,32 +8206,35 @@
%0A
+ //
%7D%0A%0A
includeBuild ('libraries/fresco')
์์ include ':app'
rootProject.name = 'YOURPROJECT'
...
includeBuild ('libraries/fresco')
include ':app'
Gradle ์ข ์์ฑ ์ฌ์ฉ์ 3.4.1์ ๋๋ค.
dependencies {
...
classpath("com.android.tools.build:gradle:3.4.1")
...
}
yarn fresco-setup
๋๋ r21 ๋ฒ์ ์ ์ฌ์ฉํ๋ค.
https://developer.android.com/ndk/downloads
NDK ์์ถ ํ๊ธฐ
ndk์ ์์ถ์ Users/YOURNAME/Library/Android/android-ndk-r21
ํ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ์ android/libraries/fresco/local.properties
๋ฅผ ๋ง๋ญ๋๋ค.
ndk.dir=/Users/YOURNAME/Library/Android/android-ndk-r21
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
๊ทธ๊ฒ ๋ค์ผ.
yarn android
ํฐ ์ด๋ฏธ์ง ํ์ง์ ํ์ธํ์ญ์์ค.
@clytras ๋๋ถ์
@JeffGuKang
file-patch
๋ช
๋ น์ด ๋ฌด์์
๋๊น?
์ด๊ฒ์ด ๋ณํฉ๋๋ ๊ฒ์ ๋ง๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ๋จ์ํ ์์ ํ๋ ๋์ ์ด๋ฌํ ํจ์น๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@kalmahik file-patch
๋ NPM ํจํค์ง CLI ํจ์น ๋๊ตฌ์
๋๋ค.
@JeffGuKang ํ
ํ๋ฆฟ ์ค์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ํ๋ ๋ฐ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ package.json
์ ํฌํจํด์ผ ํฉ๋๋ค.
@CaptainN ์์ ์ปค๋ฐ์ ์์ง ํ ์คํธํ ์๊ฐ์ด ์์์ง๋ง ๊ทธ๋ ๊ฒ ๊ฐ๋จํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ด ์ค @clytras ํ๋ ? ๊ณ ๋ง์)
@kalmahik
์ด ๋ฐฉ๋ฒ์ ์๋ํ์ญ์์ค. (๋ด RN์ v0.61.4์ ๋๋ค)
๊ธฐ์กด ํ๋ก์ ํธ์ @clytras ' ํจ์น๋ฅผ ์ ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์ด์ ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๋๋ ํญ์ ์ค์ ์ฅ์น์์ ํ ์คํธํ๊ณ ์์ต๋๋ค. ๐ข
- package.json์ ์คํฌ๋ฆฝํธ ์ถ๊ฐ
"fresco-clone": "git clone https://github.com/facebook/fresco.git android/libraries/fresco && cd android/libraries/fresco && git checkout tags/v2.1.0", "fresco-patch": "yarn file-patch ./patches/DecodeProducer.java.diff android/libraries/fresco/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java", "fresco-setup": "yarn fresco-clone && yarn fresco-patch"
- ํจ์น/DecodeProducer.java.diff ๋ง๋ค๊ธฐ
'์์ฌ ํ๋ ์ค์ฝ ํจ์น'
๊ฒฐ๊ณผ
@@ -7279,32 +7279,35 @@ +// if (mDownsampleE @@ -7381,24 +7381,27 @@ +// ImageReque @@ -7460,24 +7460,27 @@ +// if (mDowns @@ -7513,24 +7513,27 @@ + // %7C%7C !U @@ -7587,36 +7587,39 @@ +// + encodedImage.set @@ -7637,32 +7637,35 @@ %0A + // Downsam @@ -7700,32 +7700,35 @@ %0A + // req @@ -7762,32 +7762,35 @@ +// requ @@ -7820,32 +7820,35 @@ %0A + // enc @@ -7866,32 +7866,35 @@ +// maxB @@ -7914,32 +7914,35 @@ +// %7D%0A @@ -7937,32 +7937,35 @@ +// %7D%0A%0A @@ -7962,24 +7962,27 @@ + // if (produce @@ -8002,28 +8002,31 @@ +// + .getImagePip @@ -8050,24 +8050,27 @@ + // .getExp @@ -8091,24 +8091,27 @@ + // .should @@ -8151,24 +8151,27 @@ +// maybeIncre @@ -8206,32 +8206,35 @@ %0A + // %7D%0A%0A
- android/settings.gradle ์์
includeBuild ('libraries/fresco')
์์include ':app'
rootProject.name = 'YOURPROJECT' ... includeBuild ('libraries/fresco') include ':app'
- ์๋๋ก์ด๋/๋น๋.gradle
Gradle ์ข ์์ฑ ์ฌ์ฉ์ 3.4.1์ ๋๋ค.
dependencies { ... classpath("com.android.tools.build:gradle:3.4.1") ... }
- ์คํฌ๋ฆฝํธ ์คํ
yarn fresco-setup
- ์๋๋ก์ด๋ ndk ๋ค์ด๋ก๋
๋๋ r21 ๋ฒ์ ์ ์ฌ์ฉํ๋ค.
https://developer.android.com/ndk/downloads
- ndk์ ์์ถ์ ํ๊ณ ์ด๋
NDK ์์ถ ํ๊ธฐ
ndk์ ์์ถ์Users/YOURNAME/Library/Android/android-ndk-r21
ํ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ์android/libraries/fresco/local.properties
๋ฅผ ๋ง๋ญ๋๋ค.ndk.dir=/Users/YOURNAME/Library/Android/android-ndk-r21 org.gradle.daemon=true org.gradle.parallel=true org.gradle.configureondemand=true
- ์๋๋ก์ด๋ ์คํ
๊ทธ๊ฒ ๋ค์ผ.
yarn android
ํฐ ์ด๋ฏธ์ง ํ์ง์ ํ์ธํ์ญ์์ค.@clytras ๋๋ถ์
@clytras ์คํฌ๋ฆฝํธ์ ๋ฐ๋ผ ์์ค์์ Fresco๋ฅผ ์ปดํ์ผํ๋ ค๊ณ ํ ๋ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ๊ธฐ์กด RN(v0.59.9) ํ๋ก์ ํธ๋ก ์ปดํ์ผ ์ค์ ๋๋ค.
๋ํ MainApplication.java์ Fresco Config๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ์๋ํ์ง๋ง ์ด์ด ์์์ต๋๋ค.
@ravali121 ์ด ๋จ๊ณ๋ RN 0.59 ๋๋ ์ด์ ๋ฒ์ ์ด ์๋ RN >= 0.60.x์ฉ์
๋๋ค. ์ด์ RN ๋ฒ์ ์ ๋ํด ํจ์นํ ์ ์์ง๋ง ๋จ๊ณ ๋ฐ Fresco ์ฒดํฌ์์์ ํน์ RN ๋ฒ์ ๊ณผ ํจ๊ป ์ ๊ณต๋๋ ๋ฒ์ ์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. RN 0.61์ฉ Fresco 2.1.0๊ณผ RN 0.59๋ ๋ค๋ฅธ ๋ฒ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ฌผ๋ก ํจ์น๊ฐ ํ์ํ์ง๋ ์์ง๋ง ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ DecodeProducer.java
๋ฅผ ํธ์งํ์ฌ ์๋์ผ๋ก ์ ์ฉํ ์ ์์ต๋๋ค. ๋ํ ์ข
์์ฑ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ถ๊ฐ gradle ๊ตฌ์ฑ์ด ์์ต๋๋ค.
0.59์์ ์๋ํ๋๋ก ๋ง๋ค ์ ์์ง๋ง ํ๋ก์ ํธ๋ฅผ ์ต์ 0.61(๋๋ ๋ ๋์ 0.62)๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ ํ์ญ๋๊น! ํจ์น๊ฐ ๋ณํฉ๋ ETA์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? (๋ฉ์ง ์์ ์ ๋ํด @clytras ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ต๋ํ ๋นจ๋ฆฌ ํจ์น๋ฅผ ์๋ํด์ผ ํ์ง๋ง ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ์ง ์๊ณ ์ถ์ต๋๋ค.)
@FRizzonelli ํจ์น๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ฉฐ ์ค์ ๋ก ๋ฌธ์ ์ ๋ํ ์์ ์ฌํญ์ด ์๋๋ฏ๋ก ์ด ๋ฌธ์ ๊ฐ ์ค๋ซ๋์ ์ด๋ ค ์์ต๋๋ค.
ํจ์น์ @react-native-community/cli
ํ
ํ๋ฆฟ์ ํ์ธํ๊ณ ์ต์ RN ๋ฒ์ ์ผ๋ก ์
๊ทธ๋ ์ด๋ํด์ผ ํฉ๋๋ค.
@clytras ์ดํดํฉ๋๋ค:( ๋ฌธ์ ๋ ์ง๊ธ Expo์์ react-native-web์ ์ฌ์ฉํ์ฌ ์์ POC๋ฅผ ์ค์ ํ๋ ค๊ณ ํ๋๋ฐ Android์ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ๋ฐ๋ชจ์์๋ ๊บผ๋ด์ง ์๊ณ ์ถ์ต๋๋ค. ํ์ง๋ง ๋๋ ๋ด๊ฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค :(
@clytras ์ดํดํฉ๋๋ค:( ๋ฌธ์ ๋ ์ง๊ธ Expo์์ react-native-web์ ์ฌ์ฉํ์ฌ ์์ POC๋ฅผ ์ค์ ํ๋ ค๊ณ ํ๋๋ฐ Android์ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ๋ฐ๋ชจ์์๋ ๊บผ๋ด์ง ์๊ณ ์ถ์ต๋๋ค. ํ์ง๋ง ๋๋ ๋ด๊ฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค :(
png
๋์ jpg
ํ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๋๋ ๊ทธ๊ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ํ์ ํ์ง ๋ชปํ๋ค.
@clytras ์ดํดํฉ๋๋ค:( ๋ฌธ์ ๋ ์ง๊ธ Expo์์ react-native-web์ ์ฌ์ฉํ์ฌ ์์ POC๋ฅผ ์ค์ ํ๋ ค๊ณ ํ๋๋ฐ Android์ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ๋ฐ๋ชจ์์๋ ๊บผ๋ด์ง ์๊ณ ์ถ์ต๋๋ค. ํ์ง๋ง ๋๋ ๋ด๊ฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค :(
png
๋์jpg
ํ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๋๋ ๊ทธ๊ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ํ์ ํ์ง ๋ชปํ๋ค.
๋ถํํ๋ ์๋ํ์ง ์์ผ๋ฉฐ ์ํ ๋ ์ด์ด์ png๊ฐ ํ์ํฉ๋๋ค :(
RN 0.63.4์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
960 x 13983์ ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ ๋ค์ด์ํ๋ง์ ๋ง์ด ํด์ ์ด๋ฏธ์ง์ ๊ธ์๊ฐ ์ ์ฝํ์ง ์์ต๋๋ค.
680 X 2538์ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ ๋ค์ด ์ํ๋ง๋์์ง๋ง ๊ฝค ๊ด์ฐฎ์ต๋๋ค.
Image.getSize๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ฐพ๊ณ ๋์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค(๋๋น 100%).
์ด๋ฏธ์ง๋ ๋ชจ๋ jpg์
๋๋ค.
๋๋ Gradle์ 3.5.4, NDK 21.4.7075529์ @clytras์ ๋ฐฉ๋ฒ์ํ๋ค. ํ์ง๋ง, ๊ฐ์ ๋ฌธ์ .
<Image
style={{ width: SCREEN_WIDTH, height }}
resizeMode="contain"
source={{ uri }}
resizeMethod="scale"
/>
FastImage๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
<FastImage
style={{ width: SCREEN_WIDTH, height: height }}
source={{
uri: uri,
priority: FastImage.priority.normal,
}}
resizeMode={FastImage.resizeMode.center}
/>
@JJMoon ์คํ์ผ์์ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ๋ FastImage๋ฅผ ๊ฐ์ ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๊น?
์ด๋ฏธ์ง๋ ํญ์ ๋ค์ ๋ ๋๋ง๋์ง๋ง FastImage๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
ํจ๊ป ์๋ ,
์ด ์ค๋ ๋์์ ๊ฐ๋ฅํ ๋ชจ๋ ์๋ฃจ์
์ ์๋ํ์ง๋ง RN 0.64.2 ๋ฐ Fresco 2.5.0์ ์ฌ์ฉํ์ต๋๋ค.
NDK v22.1.7171670 ๋ฐ gradle 4.2.1์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํ์ฌ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค(android-emulator์ ๊ด๋ จ๋ ๋ฌธ์ ์ ๋๊น?).
E/AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
Process: com.veerle.wiener.debug, PID: 10813
java.lang.NoSuchMethodError: No static method initialize(Lcom/facebook/imagepipeline/core/ImagePipelineConfig;)V in class Lcom/facebook/imagepipeline/core/ImagePipelineFactory; or its super classes (declaration of 'com.facebook.imagepipeline.core.ImagePipelineFactory' appears in /data/app/<project>/base.apk!classes16.dex)
at com.facebook.drawee.backends.pipeline.Fresco.initialize(Fresco.java:83)
at com.facebook.drawee.backends.pipeline.Fresco.initialize(Fresco.java:45)
at com.facebook.react.modules.fresco.FrescoModule.initialize(FrescoModule.java:114)
at com.facebook.react.bridge.ModuleHolder.doInitialize(ModuleHolder.java:236)
at com.facebook.react.bridge.ModuleHolder.markInitializable(ModuleHolder.java:100)
at com.facebook.react.bridge.NativeModuleRegistry.notifyJSInstanceInitialized(NativeModuleRegistry.java:103)
at com.facebook.react.bridge.CatalystInstanceImpl$2.run(CatalystInstanceImpl.java:438)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
at android.os.Looper.loop(Looper.java:223)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
at java.lang.Thread.run(Thread.java:923)
I/Process: Sending signal. PID: 10813 SIG: 9
@JJMoon ์ ๋ก์ปฌ ์ด๋ฏธ์ง์ ํจ๊ป
ํ์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋์ Image์ FastImage๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
if(height < blurSize){
return <Image/>
}else{
return <FastImage/>
}
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@CaptainN ๋ฌด๋กํ์ง ์์ต๋๋ค. ๋ฌธ์ ๋ ๋ด๊ฐ ๊ทธ๊ฒ์ํ๊ณ ๋ชจ๋ ์ค๋ฅ์ ์ง๋ฉดํ๊ธฐ ๋๋ฌธ์ Fresco๋ฅผ ์ค์นํ๊ณ ํจ์นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ด ํฌํจ๋ ์คํํฐ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ํจ์ฌ ์ ์ ์๊ฐ์ด ์์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ ์์ต๋๋ค: https://github.com/clytras/RN061FrescoBuild
RN 0.61.5
์์ต๋๋ค. ๋ฆฌํฌ์งํ ๋ฆฌ์๋ ์์ธํ ์ง์นจ์ด ์์ต๋๋ค. ์ด ์ฒดํฌ ์์์ ํ๋ ์ค์ฝ์, ํด๋กv2.1.0
ํ๊ณ ํจ์น๋ฅผ ์ ์ฉDecodeProducer.java
๊ทธ๋์ ๋ค์ด ์ํ๋ง ์ฝ๋๋ฅผ ์ฃผ์. Android NDK๋ฅผ ๋ค์ด๋ก๋ํ๊ณlibraries/fresco/local.properties
ํ์ผ์ ์ถ๊ฐํ๊ธฐ์ง์นจ๊ณผ yarn ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ธฐ์กด RN >= 0.60(_๋๋ ์ด์ ๋ฒ์ _) ํ๋ก์ ํธ์ fresco lib๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.