////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
출처: https://developer.android.com/guide/topics/graphics/hardware-accel.html
Application level
In your Android manifest file, add the following attribute to the <application>
tag to enable hardware acceleration for your entire application:
<application android:hardwareAccelerated="true" ...>
Activity level
If your application does not behave properly with hardware acceleration turned on globally, you can control it for individual activities as well. To enable or disable hardware acceleration at the activity level, you can use the android:hardwareAccelerated
attribute for the <activity>
element. The following example enables hardware acceleration for the entire application but disables it for one activity:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
Window level
If you need even more fine-grained control, you can enable hardware acceleration for a given window with the following code:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
Note: You currently cannot disable hardware acceleration at the window level.
View level
You can disable hardware acceleration for an individual view at runtime with the following code:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Note: You currently cannot enable hardware acceleration at the view level. View layers have other functions besides disabling hardware acceleration. See View layers for more information about their uses.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
출처: https://stackoverflow.com/questions/11933737/android-enable-hardware-acceleration
The above code looks ok. The same problem is posted at HoneyComb isHardwareAccelerated() always returns false. Yet Android 3.0 Hardware Acceleration writes
If you need more fine-grained control, you can enable hardware acceleration for a given window at runtime:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
출처: http://gakari.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4-%EA%B0%80%EC%86%8D-%EA%B8%B0%EB%8A%A5
안드로이드 3.0 부터 하드웨어 가속 기능을 지원한다. 하드웨어 가속은 그래픽 처리를 할 때 GPU를 사용하여 그리는 방식이다.
하지만 다음 메소드는 아직 가속을 지원하지 않는다.
클래스 | 메소드 |
Canvas | clipPath, clipRegion, drawPicture, drawTextOnPath, drawVertices |
Paint | setLinearText, setMaskFilter, setRasterizer |
Xfermodes | AvoidXfermode, PixelXorXfermode |
다음 기능은 하드웨어 가속을 사용하면 다르게 동작하는 메소드이다.
클래스 | 메소드 |
Canvas | clipRect - 일부 모드가 무시된다. drawBitmapMesh - 색상 배열이 무시된다. |
Paint | setDither - 무시된다. setFilterBitmap - 필터링이 항상 켜진다. setShadowLayer - 텍스트에 대해서만 정상 작동한다. |
PorterDuffXfermode | DARKEN, LIGHTEN, OVERLAY 모드가 SRC_OVER와 같음 |
ComposeShader | ComposeShader가 같은 타입의 셰이더는 조합하지 못하며 중첩도 안된다. |
하드웨어 가속 기능은 속도를 향상시키는 것이 주목적이며 출력의 결과나 품질과는 상관 없다.
개발자는 앱, 액티비티, 윈도우, 뷰 4가지 수준에서 가속 기능의 사용 여부를 선택할 수 있다.
앱과 액티비티의 가속 기능 사용 여부는 매니페스트의 속성으로 제어한다.
<application android:hardwareAccelerated="true">
<activity name="A"/>
<activity name="B"/>
<activity name="C" android:hardwareAccelerated="false"/>
</application>
위와 같이 hardwareAccelerated 속성을 지정함으로써 가속 기능의 사용 여부를 나타낸다.
윈도우는 setFlags 메소드로 FLAG_HARDWARE_ACCELERATED 플래그를 지정함으로써 가속 기능을 선택한다.
하지만 액티비티의 가속 설정을 조정하는 것이 더 편리해서 이 플래그를 쓸일은 없다.
액티비티는 가속을 쓰지만 뷰만 쓰고 싶지 않다면 다음 메소드를 호출하면 된다.
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
현재 가속 기능이 적용되고 있는지 아닌지는 다음 2가지 방법으로 조사한다. (뷰나 캔버스에 대해서)
boolean View.isHardwareAccelerated()
boolean Canvas.isHardwareAccelerated()
뷰는 가속 중이라도 비트맵에 그릴 때 캔버스는 가속상태가 아닐 수도 있으므로 뷰보다는 캔버스의 가속 상태를 조사하는 것이 더 정확하다.
(캔버스에 직접 그리기를 하지 않는다면 뷰를 통해 조사하면됨)
이번 예제는 하드웨어 가속을 사용할 때와 사용하지 않았을 때의 비교이다.
아래와 같이 2개의 파일만 수정한다.
AccelTest1.java
package com.example.ch22_acceltest1;
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
public class AccelTest1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.acceltest1);
AccelTestView vw = new AccelTestView(this);
setContentView(vw);
}
}
class AccelTestView extends View{
Random Rnd = new Random();
int Radius = 1;
public AccelTestView(Context context){
super(context);
}
public void onDraw(Canvas canvas){
canvas.drawColor(Color.GRAY);
Paint Pnt = new Paint();
Pnt.setAntiAlias(true);
Pnt.setTextSize(30);
if(canvas.isHardwareAccelerated()){
canvas.drawText("Hardware Accel", 50, 50, Pnt);
}else{
canvas.drawText("Software Draw", 50, 50, Pnt);
}
Pnt.setStyle(Paint.Style.STROKE);
Pnt.setStrokeWidth(3);
Radius += 3;
if(Radius > 255) Radius = 1;
for(int i = 1; i < Radius; i+=3){
Pnt.setColor(Color.rgb(i, i, i));
canvas.drawCircle(240, 400, i, Pnt);
}
invalidate();
}
}
AndroidMenifest,xml 파일
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ch22_acceltest1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".AccelTest1"
android:label="@string/app_name"
android:hardwareAccelerated="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
실행 화면
하드웨어 가속을 사용하지 않았을 때는 동그라미를 그릴 때 약간 부드럽지가 않다.
메니페스트 파일에서 hardwareAccelerated를 false로 둔다.
하드웨어 가속을 사용하면 끊김 없이 부드럽게 동그라미가 그려진다.
메니페스트 파일에서 hardwareaccelerated 를 true로 둔다.
출처: http://gakari.tistory.com/entry/안드로이드-하드웨어-가속-기능 [가카리의 공부방]
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'스마트기기개발관련 > 안드로이드 개발' 카테고리의 다른 글
[android] 안드로이드 빌드 또는 APK빌드시 LINT 에러 관련 (0) | 2018.10.15 |
---|---|
[android] 안드로이드 시스템설정의 폰트크기에 따라 WebView의 웹페이지 폰트크기 달라질 경우 고정하기 관련 (0) | 2018.04.27 |
[android] 안드로이드 N, 안드로이드 7 이상 화면 사이즈 변경에 따른 대응 방법 관련 (0) | 2018.04.03 |
[android] 안드로이드 WebView로 HTML5 하이브리드 앱 설정 개발 관련 (0) | 2018.03.31 |
[android] 안드로이드 Assets 폴더 내에 html을 넣고 리소스,코드들 css, img, js 등등 를 상대경로로 사용하기 (3) | 2018.03.30 |
댓글 영역