├── .gitignore ├── .idea ├── encodings.xml ├── gradle.xml ├── markdown-navigator │ └── profiles_settings.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── Untitled Diagram.drawio ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── android │ │ └── xrj │ │ └── opengl │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── android │ │ │ └── xrj │ │ │ └── opengl │ │ │ ├── GLLinearLayoutActivity.java │ │ │ ├── GLWebViewActivity.java │ │ │ ├── MainActivity.java │ │ │ └── util │ │ │ ├── DisplayUtil.java │ │ │ └── StatusUtil.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_gl_line.xml │ │ ├── activity_gl_webview.xml │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── android │ └── xrj │ └── opengl │ └── ExampleUnitTest.java ├── art └── 2.png ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── support.xrj.opengl ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src ├── androidTest └── java │ └── android │ └── xrj │ └── opengl │ └── support │ └── ExampleInstrumentedTest.java ├── main ├── AndroidManifest.xml ├── java │ └── android │ │ └── xrj │ │ └── opengl │ │ └── support │ │ ├── BaseGLRenderer.java │ │ ├── FooRenderer.java │ │ ├── GLRenderable.java │ │ ├── RawResourceReader.java │ │ ├── ShaderHelper.java │ │ └── view │ │ ├── GLLinearLayout.java │ │ └── GLWebView.java └── res │ ├── raw │ ├── rect_fragment_shader.glsl │ └── vertex_shader.glsl │ └── values │ └── strings.xml └── test └── java └── android └── xrj └── opengl └── support └── ExampleUnitTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 36 | 37 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 91 | 101 | 102 | 103 | 104 | 105 | 106 | 108 | 109 | 110 | 111 | 112 | 1.8 113 | 114 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndroidOpenGLView 2 | 使用OpenGL 渲染 WebView 3 | 4 | ### 图片 5 | ![image](art/2.png) 6 | -------------------------------------------------------------------------------- /Untitled Diagram.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 27 5 | defaultConfig { 6 | applicationId "android.xrj.opengl" 7 | minSdkVersion 17 8 | targetSdkVersion 26 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(include: ['*.jar'], dir: 'libs') 23 | implementation 'com.android.support:appcompat-v7:27.1.1' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.2' 25 | testImplementation 'junit:junit:4.12' 26 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 28 | implementation project(':support.xrj.opengl') 29 | implementation 'com.android.support:design:27.1.1' 30 | } 31 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/android/xrj/opengl/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package android.xrj.opengl; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("android.xrj.opengl", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/android/xrj/opengl/GLLinearLayoutActivity.java: -------------------------------------------------------------------------------- 1 | package android.xrj.opengl; 2 | 3 | import android.app.Activity; 4 | import android.opengl.GLSurfaceView; 5 | import android.os.Bundle; 6 | import android.webkit.WebChromeClient; 7 | import android.webkit.WebViewClient; 8 | import android.widget.FrameLayout; 9 | import android.xrj.opengl.support.BaseGLRenderer; 10 | import android.xrj.opengl.support.FooRenderer; 11 | import android.xrj.opengl.support.view.GLWebView; 12 | import android.xrj.opengl.util.DisplayUtil; 13 | import android.xrj.opengl.util.StatusUtil; 14 | 15 | /** 16 | * Create by LingYan on 2018-08-27 17 | */ 18 | 19 | public class GLLinearLayoutActivity extends Activity { 20 | private static final String TAG = "GLLinearLayoutActivity"; 21 | 22 | private FrameLayout root; 23 | private GLSurfaceView glSurfaceView; 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_gl_line); 29 | root = findViewById(R.id.root); 30 | glSurfaceView = findViewById(R.id.gl_surface_view); 31 | 32 | GLWebView webView = new GLWebView(this); 33 | 34 | int width = DisplayUtil.getWidth(this); 35 | int height = DisplayUtil.getHeight(this) - StatusUtil.getStatusHeight(this); 36 | 37 | final BaseGLRenderer baseGlRenderer = new FooRenderer(this, width, height); 38 | 39 | glSurfaceView.setEGLContextClientVersion(2); 40 | glSurfaceView.setRenderer(baseGlRenderer); 41 | webView.setViewToGLRenderer(baseGlRenderer); 42 | 43 | webView.setWebViewClient(new WebViewClient()); 44 | webView.setWebChromeClient(new WebChromeClient()); 45 | webView.loadUrl("https://www.baidu.com"); 46 | 47 | root.addView(webView); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/android/xrj/opengl/GLWebViewActivity.java: -------------------------------------------------------------------------------- 1 | package android.xrj.opengl; 2 | 3 | import android.app.Activity; 4 | import android.opengl.GLSurfaceView; 5 | import android.os.Bundle; 6 | import android.support.design.widget.AppBarLayout; 7 | import android.webkit.WebChromeClient; 8 | import android.webkit.WebViewClient; 9 | import android.xrj.opengl.support.BaseGLRenderer; 10 | import android.xrj.opengl.support.FooRenderer; 11 | import android.xrj.opengl.support.view.GLWebView; 12 | import android.xrj.opengl.util.DisplayUtil; 13 | import android.xrj.opengl.util.StatusUtil; 14 | 15 | /** 16 | * Create by LingYan on 2018-08-27 17 | */ 18 | 19 | public class GLWebViewActivity extends Activity { 20 | private static final String TAG = "GLWebViewActivity"; 21 | private GLSurfaceView mGLSurfaceView; 22 | private GLWebView mWebView; 23 | private AppBarLayout appBarLayout; 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_gl_webview); 29 | mGLSurfaceView = findViewById(R.id.gl_surface_view); 30 | mWebView = findViewById(R.id.web_view); 31 | appBarLayout = findViewById(R.id.appbar_layout); 32 | 33 | int width = DisplayUtil.getWidth(this); 34 | int height = DisplayUtil.getHeight(this) - StatusUtil.getStatusHeight(this) - appBarLayout.getHeight(); 35 | 36 | final BaseGLRenderer baseGlRenderer = new FooRenderer(this, width, height); 37 | 38 | mGLSurfaceView.setEGLContextClientVersion(2); 39 | mGLSurfaceView.setRenderer(baseGlRenderer); 40 | 41 | mWebView.setViewToGLRenderer(baseGlRenderer); 42 | 43 | mWebView.setWebViewClient(new WebViewClient()); 44 | mWebView.setWebChromeClient(new WebChromeClient()); 45 | mWebView.loadUrl("https://www.baidu.com"); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/android/xrj/opengl/MainActivity.java: -------------------------------------------------------------------------------- 1 | package android.xrj.opengl; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | 8 | public class MainActivity extends AppCompatActivity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_main); 14 | 15 | findViewById(R.id.open_gl_web).setOnClickListener(new View.OnClickListener() { 16 | @Override 17 | public void onClick(View v) { 18 | Intent intent = new Intent(MainActivity.this, GLWebViewActivity.class); 19 | startActivity(intent); 20 | } 21 | }); 22 | 23 | findViewById(R.id.open_gl_view).setOnClickListener(new View.OnClickListener() { 24 | @Override 25 | public void onClick(View v) { 26 | Intent intent = new Intent(MainActivity.this, GLLinearLayoutActivity.class); 27 | startActivity(intent); 28 | } 29 | }); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/android/xrj/opengl/util/DisplayUtil.java: -------------------------------------------------------------------------------- 1 | package android.xrj.opengl.util; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Create by LingYan on 2018-08-27 7 | */ 8 | 9 | public class DisplayUtil { 10 | public static int getWidth(Context context) { 11 | return context.getResources().getDisplayMetrics().widthPixels; 12 | } 13 | 14 | public static int getHeight(Context context) { 15 | return context.getResources().getDisplayMetrics().heightPixels; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/android/xrj/opengl/util/StatusUtil.java: -------------------------------------------------------------------------------- 1 | package android.xrj.opengl.util; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Create by LingYan on 2018-08-27 7 | */ 8 | 9 | public class StatusUtil { 10 | public static int getStatusHeight(Context context) { 11 | int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); 12 | if (resourceId > 0) { 13 | return context.getResources().getDimensionPixelSize(resourceId); 14 | } 15 | return 0; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_gl_line.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_gl_webview.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 15 | 16 | 22 | 23 | 24 | 25 | 26 | 30 | 31 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 32 | 33 |