Android绘图机制与处理技巧-更新中
概述
這里我們主要來探討下
- Android屏幕的相關只是
- Android繪圖技巧
- Android圖像處理技巧
- SurfaceView的使用
繪圖技巧中,醫(yī)生講的比較粗略,更多的細節(jié)參考了 Keegan小鋼的博文
屏幕的尺寸信息
Android手機屏幕,不管是分辨率還是大小,五花八門。。。要想在不同的屏幕上保持繪圖的準確性,需要對屏幕有充分的認識.
屏幕參數(shù)
- 屏幕大小
指屏幕對角線的長度,通常用寸來表示。比如5.5寸手機等…. - 分辨率
指手機屏幕的像素點的個數(shù),比如720X1280就是指的屏幕的分辨率 寬有720個像素點,高有1280個像素點 - PPI
指的是 每英寸(Pixels Per Inch),又被稱為DPI (Dots Per Inch). 它是由對角線的像素點 除以 屏幕的大小得到的。 通常400PPI已經是非常高的屏幕密度了。
系統(tǒng)屏幕密度
系統(tǒng)定義了幾個標準DPI的值,作為手機的固定的DPI
。
獨立像素密度dp
Android使用mdpi即密度值為160的屏幕作為標準,在這個屏幕上 1px = 1dp .
其他屏幕則可以通過比例進行換算。
在mdpi中 1dp = 1px
在hdpi中 1dp = 1.5px
在xhdpi中 1dp = 2px
在xxhdpi中 1dp = 3px.
各個比例之間的的換算比例
ldp:mdpi:hdpi:xhdpi:xxhdpi = 3:4:6:8:12
單位轉換-DisplayUtil
import android.app.Activity; import android.content.Context; import android.graphics.Rect; import android.util.DisplayMetrics; import android.view.Window; import android.view.WindowManager;/*** MyApp** @author Mr.Yang on 2016-04-10 21:58.* @version 1.0* @desc*/ public class DisplayUtil {/*** 獲取手機屏幕高度,以px為單位** @param context* @return*/public static int getScreenHeight(Context context) {DisplayMetrics metrics = new DisplayMetrics();WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);manager.getDefaultDisplay().getMetrics(metrics);return metrics.heightPixels;}/*** 獲取手機屏幕寬度,以px為單位** @param context* @return*/public static int getScreenWidth(Context context) {DisplayMetrics metrics = new DisplayMetrics();WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);manager.getDefaultDisplay().getMetrics(metrics);return metrics.widthPixels;}/*** 返回程序window寬度** @return*/public static int getWindowWidth(Activity activity) {return activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getWidth();}/*** 返回程序window高度,不包括通知欄和標題欄** @return*/public static int getWindowContentHeight(Activity activity) {return activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getHeight();}/*** 返回程序window高度,不包括通知欄** @return*/public static int getWindowHeight(Activity activity) {return getScreenHeight(activity) - getStatusBarHeight(activity);}/*** 返回屏幕像素密度** @param context* @return*/public static float getPixelDensity(Context context) {return context.getResources().getDisplayMetrics().density;}/*** 返回狀態(tài)欄高度** @param activity* @return*/public static int getStatusBarHeight(Activity activity) {Rect outRect = new Rect();activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);return outRect.top;}public static int getTitleBarHeight(Activity activity) {return getScreenHeight(activity) - getWindowContentHeight(activity) - getStatusBarHeight(activity);}/*** 單位轉換,將dip轉換為px,保證尺寸大小不變** @param dp* @param context* @return*/public static int dip2px(float dp, Context context) {float scale = context.getResources().getDisplayMetrics().density;return (int) (dp * scale + 0.5f);}/*** 單位轉換,將px轉換為dip,保證尺寸大小不變** @param px* @param context* @return*/public static int px2dip(float px, Context context) {float scale = context.getResources().getDisplayMetrics().density;return (int) (px / scale + 0.5f);}/*** 將px值轉換為sp值,保證文字大小不變* @param context* @param pxValue* @return*/public static int px2sp(Context context, float pxValue) {float scaleDensity = context.getResources().getDisplayMetrics().scaledDensity;//縮放密度return (int) (pxValue / scaleDensity + 0.5f);}/*** 將sp的值轉換為px的值,保證字體大小不變* @param context* @param spValue* @return*/public static int sp2px(Context context, float spValue) {float scaleDensity = context.getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * scaleDensity + 0.5f);}}以上是通過公式換算方法進行轉換,
同時,系統(tǒng)也提供了TypedValue類幫助我們轉換
/*** 使用系統(tǒng)提供的TypedValue類轉換*/protected int dp2px(int dp){return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,getResources().getDisplayMetrics());}protected int sp2px(int sp){return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,getResources().getDisplayMetrics());}2D繪圖基礎
因篇幅原因,請移步本人博客 Android-2D繪圖基礎
Android XML繪圖
請查看 Android-Xml繪圖
Android繪圖技巧
Canvas
詳情請查看 Canvas類:畫布
Layer圖層
概述
使用過PS的童鞋都一定會非常的清除,一張復雜的畫可以由多個圖層疊加起來,形成一個復雜的圖像。
在Android中,使用saveLayer()方法來創(chuàng)建一個圖層,圖層同樣是基于棧的結構進行管理的。
Android中通過調用saveLayer()、saveLayerAlpha()方法將一個圖層入棧,使用restore()、restoreToCount()方法將一個圖層出棧。
入棧的時候后面所有的操作都將發(fā)生在這個圖層上,
出棧的時候,則會把圖像繪制到上層Canvas上。
示例
public class LayerDemoActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new CustomLayer(this));}/*** 自定義View*/class CustomLayer extends View {private Paint mPaint;private static final int LAYER_FLAGS =Canvas.MATRIX_SAVE_FLAG |Canvas.CLIP_SAVE_FLAG |Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |Canvas.FULL_COLOR_LAYER_SAVE_FLAG |Canvas.CLIP_TO_LAYER_SAVE_FLAG;public CustomLayer(Context context) {super(context);mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);}@Overrideprotected void onDraw(Canvas canvas) {// 畫布背景白色canvas.drawColor(Color.WHITE);// 畫筆紅色mPaint.setColor(Color.BLUE);// 畫圓 以150,150為圓心,100為半徑canvas.drawCircle(150, 150, 100, mPaint);// 具體的透明度效果 可以參考第5個參數(shù),取值范圍0~255,值越大越不透明canvas.saveLayerAlpha(0, 0, 400, 400, 125, LAYER_FLAGS);mPaint.setColor(Color.RED);canvas.drawCircle(200, 200, 100, mPaint);canvas.restore();}} }Android圖像處理之色彩特效處理
色彩矩陣分析
Android顏色矩陣-ColorMatrix
常用圖像顏色矩陣處理效果
像素點分析
常用圖像像素點處理效果
Android圖像處理之圖形特效處理
Android變形矩陣-Matrix
像素塊分析
Android圖像處理之畫筆特效處理
PorterDuffXfermode
Shader
PathEffect
View之孿生兄弟-SurfaceView
SurfaceView和View的區(qū)別
SurfaceView的使用
SurfaceView實例
總結
以上是生活随笔為你收集整理的Android绘图机制与处理技巧-更新中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Scroll分析
- 下一篇: Android-2D绘图