最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實現(xiàn)bitmap指定區(qū)域滑動截取功能

 更新時間:2017年09月30日 08:34:09   作者:吃泥巴貓  
這篇文章主要為大家詳細介紹了Android實現(xiàn)bitmap指定區(qū)域滑動截取功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

突然不知道什么心態(tài),說要做這個,網上找了半天沒找到合適的,就自己做了一個。

先上效果圖:

透明區(qū)域為將要截取的區(qū)域,其他陰影部位為舍棄區(qū)域

圖片資源我寫死儲存在了raw中,有需要可以自己寫獲取bitmap。

界面layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.admin.myapplication.MainActivity">
  <com.admin.myapplication.ScreenShotView
    android:id="@+id/screenShotView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
  <LinearLayout
    android:id="@+id/title"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:background="#000000">
    <TextView
      android:layout_width="match_parent"
      android:layout_height="20dp"
      android:layout_gravity="center"
      android:gravity="center"
      android:text="選擇要截取區(qū)域"/>
  </LinearLayout>
  <LinearLayout
    android:id="@+id/bottom"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:layout_alignParentBottom="true"
    android:background="#000000"
    android:orientation="horizontal">
    <TextView
      android:id="@+id/cancel_btn"
      android:text="取消"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:layout_gravity="center_vertical"
      android:gravity="center"/>
    <TextView
      android:id="@+id/certain_btn"
      android:text="確定"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:layout_gravity="center_vertical"
      android:gravity="center"/>
    <TextView
      android:id="@+id/restart_btn"
      android:text="重試"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:layout_gravity="center_vertical"
      android:gravity="center"/>
  </LinearLayout>

</RelativeLayout>

ScreenShotView為自定義View用來顯示bitmap,以及滑動截圖,其中Dot類用來儲存坐標點的x,y值。

public class ScreenShotView extends View {
  private Dot startDot;
  private Dot endDot;
  private Bitmap mBitmap;
  private Bitmap ocrBitmap;
  private int screenHeight;
  private int screenWidth;
  private Dot leftTopDot;
  private Dot rightBottomDot;
  private Paint paintShadow;
  int shadow = 0xaa000000;
  int clear = 0x0000000;


  public ScreenShotView(Context context) {
    super(context);
    startDot = new Dot();
    endDot = new Dot();
    leftTopDot = new Dot();
    rightBottomDot = new Dot();
  }

  public ScreenShotView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    startDot = new Dot();
    endDot = new Dot();
    leftTopDot = new Dot();
    rightBottomDot = new Dot();
  }

  public ScreenShotView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    startDot = new Dot();
    endDot = new Dot();
    leftTopDot = new Dot();
    rightBottomDot = new Dot();
  }

  public void setBitmap(Bitmap bitmap, int screenHeight, int screenWidth) {
    mBitmap = bitmap;
    this.screenHeight = screenHeight;
    this.screenWidth = screenWidth;
    changeBitmapSize();
    invalidate();
  }

  public void restart(){
    startDot = new Dot();
    endDot = new Dot();
    leftTopDot = new Dot();
    rightBottomDot = new Dot();
    invalidate();
  }
  /**
  *將將要顯示的bitmap進行變形,使其鋪滿屏幕
  *
  */
  private void changeBitmapSize() {
    int width = mBitmap.getWidth();
    int height = mBitmap.getHeight();
    float scaleWidth = ((float) screenWidth) / width;
    float scaleHeight = ((float) screenHeight) / height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, width, height, matrix, true);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    getLeftTopDot();
    getRightBottomDot();
    drawBitmap(canvas);
    drawArea(canvas);
    drawShadowTop(canvas);
    drawShadowLeft(canvas);
    drawShadowRight(canvas);
    drawShadowBottom(canvas);
  }

  /**
  *繪制陰影
  *
  */
  private void drawShadowBottom(Canvas canvas) {
    paintShadow = new Paint();
    paintShadow.setColor(shadow);
    canvas.drawRect(0, rightBottomDot.getY(), screenWidth, screenHeight, paintShadow);
  }

  private void drawShadowRight(Canvas canvas) {
    paintShadow = new Paint();
    paintShadow.setColor(shadow);
    canvas.drawRect(rightBottomDot.getX(), leftTopDot.getY(), screenWidth, rightBottomDot.getY(), paintShadow);
  }

  private void drawShadowLeft(Canvas canvas) {
    paintShadow = new Paint();
    paintShadow.setColor(shadow);
    canvas.drawRect(0, leftTopDot.getY(), leftTopDot.getX(), rightBottomDot.getY(), paintShadow);
  }

  private void drawShadowTop(Canvas canvas) {
    paintShadow = new Paint();
    paintShadow.setColor(shadow);
    canvas.drawRect(0, 0, screenWidth, leftTopDot.getY(), paintShadow);
  }

  private void drawBitmap(Canvas canvas) {
    Paint paint = new Paint();
    canvas.drawBitmap(mBitmap, 0, 0, paint);
  }

  /**
   * 畫出截圖區(qū)域
   *
   * @param canvas
   */
  private void drawArea(Canvas canvas) {
    Paint paint = new Paint();
    paint.setColor(clear);
    canvas.drawRect(leftTopDot.getX(), leftTopDot.getY(), rightBottomDot.getX(), rightBottomDot.getY(), paint);
  }


  /**
   * 獲取截圖區(qū)域bitmap
   *
   * @return 截圖
   */
  public Bitmap getBitmap() {
    if (mBitmap != null) {
      getLeftTopDot();
      getRightBottomDot();
      if (getBitmapOutWidth() > 0 && getBitmapOutHeight() > 0) {
        if(leftTopDot.getY()<0){
          leftTopDot.setY(0);
        }
        ocrBitmap = Bitmap.createBitmap(mBitmap, (int) leftTopDot.getX(), (int) leftTopDot.getY(), getBitmapOutWidth(), getBitmapOutHeight());
      }
    }
    return ocrBitmap;
  }

  /**
   * 獲取截圖區(qū)域寬度
   *
   * @return
   */
  private int getOutWidth() {
    return (int) (rightBottomDot.getX() - leftTopDot.getX());
  }

  /**
   * 獲取截圖區(qū)域高度
   *
   * @return
   */
  private int getOutHeight() {
    return (int) (rightBottomDot.getY() - leftTopDot.getY());
  }

  private int getBitmapOutWidth() {
    int bitmapOutWidth;
    int scale = getOutWidth() * mBitmap.getWidth();
    bitmapOutWidth = scale / screenWidth;
    return bitmapOutWidth;
  }

  private int getBitmapOutHeight() {
    int bitmapOutHeight;
    int scale = getOutHeight() * mBitmap.getHeight();
    bitmapOutHeight = scale / screenHeight;
    return bitmapOutHeight;
  }

  private void getLeftTopDot() {
    if (endDot.getX() > startDot.getX()) {
      leftTopDot.setX(startDot.getX());
    } else {
      leftTopDot.setX(endDot.getX());
    }
    if (endDot.getY() > startDot.getY()) {
      leftTopDot.setY(startDot.getY());
    } else {
      leftTopDot.setY(endDot.getY());
    }
  }

  private void getRightBottomDot() {
    if (startDot.getX() > endDot.getX()) {
      rightBottomDot.setX(startDot.getX());
    } else {
      rightBottomDot.setX(endDot.getX());
    }
    if (startDot.getY() > endDot.getY()) {
      rightBottomDot.setY(startDot.getY());
    } else {
      rightBottomDot.setY(endDot.getY());
    }

  }

  public Dot getStartDot() {
    return startDot;
  }

  public void setStartDot(Dot startDot) {
    this.startDot = startDot;
  }

  public Dot getEndDot() {
    return endDot;
  }

  public void setEndDot(Dot endDot) {
    this.endDot = endDot;
  }

}

MainActivity中完成對點擊滑動的監(jiān)控,通過坐標點的方式獲得需要繪制的矩形位置和形狀。

public class MainActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener {
  private ScreenShotView screenShotView;
  private Bitmap bmp;
  private Bitmap ocrBitmap;
  private TextView certainBtn;
  private TextView cancelBtn;
  private TextView restartBtn;
  private int screenWidth;
  private int screenHeight;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    screenShotView = (ScreenShotView) findViewById(R.id.screenShotView);
    cancelBtn = (TextView) findViewById(R.id.cancel_btn);
    cancelBtn.setOnClickListener(this);
    certainBtn = (TextView) findViewById(R.id.certain_btn);
    certainBtn.setOnClickListener(this);
    restartBtn = (TextView)findViewById(R.id.restart_btn);
    restartBtn.setOnClickListener(this);
    DisplayMetrics dm = new DisplayMetrics();
    //獲取屏幕信息
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    screenWidth = dm.widthPixels;
    screenHeight = dm.heightPixels;
    Resources r = this.getResources();
    InputStream is = r.openRawResource(R.raw.bg);
    BitmapDrawable bmpDraw = new BitmapDrawable(is);
    bmp = bmpDraw.getBitmap();
    screenShotView.setBitmap(bmp, screenHeight, screenWidth);
    screenShotView.setOnTouchListener(this);
  }

  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
    switch (motionEvent.getAction()) {
      case MotionEvent.ACTION_DOWN:
        screenShotView.setStartDot(new Dot(motionEvent.getX(), motionEvent.getY()));
        break;
      case MotionEvent.ACTION_MOVE:
        screenShotView.setEndDot(new Dot(motionEvent.getX(), motionEvent.getY()));
        screenShotView.setBitmap(bmp, screenHeight, screenWidth);
        break;
      case MotionEvent.ACTION_UP:
        ocrBitmap = screenShotView.getBitmap();
        break;
    }
    return true;
  }

  @Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.cancel_btn:
        finish();
        break;
      case R.id.certain_btn:
        if (ocrBitmap != null) {
          BitmapUtil.getInstance().setImageBitmap(ocrBitmap);
          Intent intent = new Intent(MainActivity.this, Main2Activity.class);
          startActivity(intent);
        }else{
          Toast.makeText(MainActivity.this,"請選擇截取區(qū)域",Toast.LENGTH_SHORT).show();
        }
        break;
      case R.id.restart_btn:
        screenShotView.restart();
        break;
    }
  }

  @Override
  protected void onResume() {
    super.onResume();
    screenShotView.restart();
  }

  @Override
  protected void onRestart() {
    super.onRestart();
    screenShotView.restart();
  }
}

運用了單例模式用來存儲截取出來的bitmap,方便跳轉時調用,不需要自己再寫類,點擊確定后,會將區(qū)域中的bitmap提取并存儲在單例中,在下一個頁面再調用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android 基于agora 開發(fā)視頻會議的代碼

    Android 基于agora 開發(fā)視頻會議的代碼

    這篇文章主要介紹了Android 基于agora 開發(fā)視頻會議,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Android平臺預置GMS包后關機鬧鐘失效問題及解決方法

    Android平臺預置GMS包后關機鬧鐘失效問題及解決方法

    這篇文章主要介紹了Android平臺預置GMS包后,關機鬧鐘失效,本文給大家分享問題原因及解決方法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Android中模仿抖音加載框之兩顆小球轉動效果

    Android中模仿抖音加載框之兩顆小球轉動效果

    這篇文章主要介紹了Android仿抖音加載框之兩顆小球轉動控件,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • 解決Android Studio sdk emulator directory is missing問題

    解決Android Studio sdk emulator directory is missing問題

    這篇文章主要介紹了解決Android Studio sdk emulator directory is missing問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Android Studio真機無線連接USB設備調試運行詳解流程

    Android Studio真機無線連接USB設備調試運行詳解流程

    你在Android Studio寫app時是否也有想過如果可以不用數據線連接手機調試運行就好了?如果需要取出數據線插接的話我肯定是嫌麻煩的,但是模擬器有時候需要測試一些需要硬件支持的功能時又不管用,所以最好的測試還是在真機上,本篇教你扔掉數據線來無線調試
    2021-11-11
  • android SDk中常用的java包介紹

    android SDk中常用的java包介紹

    在android的應用程序開發(fā)中,通常使用的是java語言,除了需要熟悉java語言的基礎知識之外,還需要了解android提供的擴展的java功能。android SDK中API提供一些擴展的java 類庫,類庫分為若干個包,每個包中包含若干個類
    2014-05-05
  • 如何使用Mock修改Android設備上的features

    如何使用Mock修改Android設備上的features

    這篇文章主要介紹了如何使用Mock修改Android設備上的features,想了解Mock的同學可以參考下
    2021-04-04
  • Android使用GestureOverlayView控件實現(xiàn)手勢識別

    Android使用GestureOverlayView控件實現(xiàn)手勢識別

    這篇文章主要為大家詳細介紹了Android使用GestureOverlayView控件實現(xiàn)手勢識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Kotlin伴隨對象的初始化方法示例講解

    Kotlin伴隨對象的初始化方法示例講解

    Kotlin語言的許多特性,包括變量不可變,變量不可為空,等等。這些特性都是為了盡可能地保證程序安全而設計的,但是有些時候這些特性也會在編碼時給我們帶來不少的麻煩,下面我們來了解伴隨對象的初始化
    2022-11-11
  • Android實現(xiàn)字母雨的效果

    Android實現(xiàn)字母雨的效果

    在學習Android的時候見到別人實現(xiàn)的黑客帝國的字母雨效果,感覺效果很炫,今天我們也來實現(xiàn)一下。
    2016-07-07

最新評論

宽城| 阳曲县| 东辽县| 凤庆县| 高碑店市| 罗田县| 滕州市| 淮北市| 新野县| 右玉县| 玛纳斯县| 肃宁县| 柳河县| 大城县| 平南县| 应用必备| 崇文区| 灌阳县| 乌拉特中旗| 伊通| 晋宁县| 丰县| 尼勒克县| 潼关县| 柘城县| 常熟市| 大英县| 五原县| 竹溪县| 抚顺市| 祁东县| 灵山县| 八宿县| 肃宁县| 东阳市| 平江县| 丽江市| 延长县| 达尔| 平遥县| 朝阳县|