日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android绘图机制与处理技巧-更新中

發布時間:2025/3/21 Android 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android绘图机制与处理技巧-更新中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

這里我們主要來探討下

  • Android屏幕的相關只是
  • Android繪圖技巧
  • Android圖像處理技巧
  • SurfaceView的使用

繪圖技巧中,醫生講的比較粗略,更多的細節參考了 Keegan小鋼的博文


屏幕的尺寸信息

Android手機屏幕,不管是分辨率還是大小,五花八門。。。要想在不同的屏幕上保持繪圖的準確性,需要對屏幕有充分的認識.

屏幕參數

  • 屏幕大小
    指屏幕對角線的長度,通常用寸來表示。比如5.5寸手機等….
  • 分辨率
    指手機屏幕的像素點的個數,比如720X1280就是指的屏幕的分辨率 寬有720個像素點,高有1280個像素點
  • PPI
    指的是 每英寸(Pixels Per Inch),又被稱為DPI (Dots Per Inch). 它是由對角線的像素點 除以 屏幕的大小得到的。 通常400PPI已經是非常高的屏幕密度了。

系統屏幕密度

系統定義了幾個標準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;}/*** 返回狀態欄高度** @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);}}

以上是通過公式換算方法進行轉換,

同時,系統也提供了TypedValue類幫助我們轉換

/*** 使用系統提供的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()方法來創建一個圖層,圖層同樣是基于棧的結構進行管理的。

Android中通過調用saveLayer()saveLayerAlpha()方法將一個圖層入棧,使用restore()restoreToCount()方法將一個圖層出棧。

入棧的時候后面所有的操作都將發生在這個圖層上
出棧的時候,則會把圖像繪制到上層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個參數,取值范圍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的區別

SurfaceView的使用

SurfaceView實例

總結

以上是生活随笔為你收集整理的Android绘图机制与处理技巧-更新中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。