FALCO


  BackView *bv = [[BackView alloc] initWithFrame:rect];
  [self.view addSubview:bv];

- (id)initWithFrame:(CGRect)theFrame {
    self = [super initWithFrame:theFrame];
    
    self.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.8];
    
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.bounds = [[self layer] bounds];

    CGRect rect = [[self layer] bounds];
    UIBezierPath *outerRectanglePath = [UIBezierPath bezierPathWithRect:rect];
    CGRect rect2 = CGRectMake(rect.size.width/2 - 50, rect.size.height/2- 50, 100, 100);
    UIBezierPath *interRectanglePath = [UIBezierPath bezierPathWithRect:rect2];
    
    [outerRectanglePath appendPath:interRectanglePath];
    maskLayer.path = outerRectanglePath.CGPath;
    maskLayer.position = CGPointMake( rect.size.width / 2.0 , rect.size.height / 2.0 );
    
    maskLayer.fillRule = kCAFillRuleEvenOdd;
//    maskLayer.fillRule = kCAFillRuleNonZero;
    [self layer].mask = maskLayer;
    
    return self;
}

Android ZXing QRコード読み込み画面に、白枠をつけるには?

バーコードの読み取りエリアは、150dp

<Framelayout>
    <RelaytiveLayout>
       barcode scan
    </RelativeLayout>
    <RelaytiveLayout>
       cross line
    </RelativeLayout>
</Framelayout>

xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<RelativeLayout
    android:layout_width="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent">

    <com.journeyapps.barcodescanner.DecoratedBarcodeView
        android:id="@+id/barcode_scanner"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_above="@+id/buttonsLayout"
        app:zxing_scanner_layout="@layout/custom_barcode_scanner"
        android:layout_alignParentTop="true">

    </com.journeyapps.barcodescanner.DecoratedBarcodeView>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_alignParentBottom="true"
        android:id="@+id/buttonsLayout"
        android:layout_toLeftOf="@+id/centerHorizont">

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Pause"
            android:onClick="pause" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Resume"
            android:onClick="resume" />
    </LinearLayout>

    <View
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:id="@+id/centerHorizont" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_toRightOf="@id/centerHorizont"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/buttonsLayout"
        android:id="@+id/barcodePreview" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignLeft="@+id/barcode_scanner"
        android:layout_alignParentTop="true"
        android:layout_alignStart="@+id/barcode_scanner"
        android:orientation="horizontal"></LinearLayout>

</RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="top"
        android:background="@android:color/white"
        android:orientation="vertical">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="戻る" />
    </LinearLayout>

        <TextView
            android:id="@+id/qr_scan_message1"
            android:text="qr_scan_message1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/crossLineLayout"
            android:layout_marginBottom="50dp"
            android:layout_marginRight="30dp"
            android:layout_marginLeft="30dp"
            />

        <TextView
            android:id="@+id/qr_scan_message2"
            android:text="qr_scan_message2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/crossLineLayout"
            android:layout_marginTop="50dp"
            android:layout_marginRight="30dp"
            android:layout_marginLeft="30dp"
            />

    <!-- cross line -->
    <LinearLayout
        android:id="@+id/crossLineLayout"
        android:layout_width="153dp"
        android:layout_height="153dp"
        android:layout_centerInParent="true"
        android:orientation="vertical">

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@android:color/white" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="75dp"
            android:orientation="horizontal">

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@android:color/white" />

            <View
                android:layout_width="75dp"
                android:layout_height="match_parent"
                android:background="@android:color/transparent" />

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@android:color/white" />

            <View
                android:layout_width="75dp"
                android:layout_height="match_parent"
                android:background="@android:color/transparent" />

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@android:color/white" />

        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@android:color/white" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="75dp"
            android:orientation="horizontal">

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@android:color/white" />

            <View
                android:layout_width="75dp"
                android:layout_height="match_parent"
                android:background="@android:color/transparent" />

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@android:color/white" />

            <View
                android:layout_width="75dp"
                android:layout_height="match_parent"
                android:background="@android:color/transparent" />

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@android:color/white" />

        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="@android:color/white" />

    </LinearLayout>
</RelativeLayout>
</FrameLayout>

Android ZXing QR 読み取りのセンターラインを消すには?

カスタムレイアウトを有効にする

    <com.journeyapps.barcodescanner.DecoratedBarcodeView
        android:id="@+id/barcode_scanner"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_above="@+id/buttonsLayout"
        app:zxing_scanner_layout="@layout/custom_barcode_scanner"
        android:layout_alignParentTop="true">

フォーカスサイズを変更する

    <com.journeyapps.barcodescanner.BarcodeView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/zxing_barcode_surface"
        app:zxing_framing_rect_width="150dp"
        app:zxing_framing_rect_height="150dp"/>

中央ラインをけす

   <com.journeyapps.barcodescanner.ViewfinderView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/zxing_viewfinder_view"
        app:zxing_possible_result_points="@color/zxing_custom_possible_result_points"
        app:zxing_result_view="@color/zxing_custom_result_view"
        app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser"
        app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/>

   <com.journeyapps.barcodescanner.ViewfinderView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/zxing_viewfinder_view"
        app:zxing_possible_result_points="@color/zxing_transparent"
        app:zxing_result_view="@color/zxing_custom_result_view"
        app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser"
        app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/>

app:zxing_possible_result_point を透明にする

バックグランドを暗くするには、以下のマスクを変更

  <color name="zxing_custom_viewfinder_mask">#90000000</color>

途中で検地されて出る青い点を消すときは

        app:zxing_viewfinder_laser="@color/zxing_transparent"

権限確認、覚書

権限がないときは、ダイアログを出して促す
ユーザーが権限を許すときは、設定画面に遷移する
権限が不足していれば、アプリ終了しますからね!

public class InitActivity extends AppCompatActivity {

    final static String [] PERMISSION_LIST =  new String[]{
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        checkPermission();
    }

    final static int MY_PERMISSIONS_REQUEST = 1;

    void checkPermission() {
        // "今後は確認しない" にチェックがある場合は、ダイアログが表示されずに onRequestPermissionsResult が呼び出される
        ActivityCompat.requestPermissions(this, PERMISSION_LIST, MY_PERMISSIONS_REQUEST);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Intent Intent = new Intent(this, MainActivity_.class);
                    startActivity(Intent);
                } else {
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivity(intent);
                }
                finish();
        }
    }

}

Toolbar の背景色、文字色、サイズを変更するには?

style.xml で指定

   <!-- Customize Application Theme -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Custom background of application -->
        <item name="android:windowBackground">@color/lightGray</item>
        <!-- Toolbar のnavigation & overflow icon の色 -->
        <item name="colorControlNormal">@color/blue_level4</item>
        <item name="windowActionModeOverlay">true</item>
        <!-- Toolar のスタイル -->
        <item name="toolbarStyle">@style/MyApp.Toolbar</item>
    </style>

    <style name="MyApp.Toolbar" parent="Widget.AppCompat.Toolbar">
        <!-- Toolar 背景色 -->
        <item name="android:background">#00FF00</item>
        <item name="titleTextAppearance">@style/MyTextAppearance</item>
    </style>

    <style name="MyTextAppearance" parent="@android:style/TextAppearance.Medium">
        <!-- Text color -->
        <item name="android:textColor">@android:color/white</item>
        <!-- Text size -->
        <item name="android:textSize">5sp</item>
    </style>

android 5.0
Toolbar のバックグランドの色をかえるには?

[java]

[java]
backgroud で指定

2017年 Android の ORM は、DbFlow に決まったと確信しました。

あまりにも導入しやすいく、あまりにも移行しやすく、あまりにもコードが簡単になる。
感動しました。

自分にとっての ORM はスピードは二の次です。
簡単に管理、コーディング出来ることが最優先です。

Create table やら、OpenDatabase やら、 Open Cursor はもやは不要です。
項目定義もクラス定義することで完了です。
感動です。

なので、使い方を紹介します。
詳しくは
https://www.gitbook.com/book/agrosner/dbflow/details

project gradle

allProjects {
    repositories {
        // required to find the project's artifacts
        maven { url "https://www.jitpack.io" }
    }
}

app gradle

def dbflow_version = "4.0.5"
dependencies {
    apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}"
    compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}"
    compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}"
}

db class

@Database(name = HatuonDb.NAME, version = HatuonDb.VERSION, generatedClassSeparator = "_")
public class HatuonDb {
    public static final String NAME = "pronunce";
    public static final int VERSION = 1;

}

table class

@Table(database = HatuonDb.class, name="T_WORD")
public class Word extends BaseModel {
    @PrimaryKey(autoincrement = true)
     public long id;

    @Column
    public String word;
    @Column
    public String type;
    @Column
    public String kigou;
    @Column
    public int ngCount;
    @Column
    public int okCount;
    @Column
    public int average;
    @Column
    public String japanese;

    @Column
    public long createdTimeMillis;
}

application class

必要なのは、FlowManager.init(this); のみ
他のコードは、SD Card に DB を保存する為にコードです。

public class MyApplication extends android.app.Application {

@Override
public void onCreate() {
    super.onCreate();
    // PronunceDbExtract();
    FlowManager.init(this);
}

@Override
public SQLiteDatabase openOrCreateDatabase(String name,
   int mode, SQLiteDatabase.CursorFactory factory) {
    return super.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), mode, factory);
}

@Override
public SQLiteDatabase openOrCreateDatabase(String name,
    int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
    return super.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), mode, factory, errorHandler);
}

@Override
public boolean deleteDatabase(String name) {
    return super.deleteDatabase(getDatabasePath(name).getAbsolutePath());
}

@Override
public File getDatabasePath(String name) {
    File file = new File(Environment.getExternalStorageDirectory(), name);
    return file;
}

/*
protected void MyDbExtract() {
    String outFile = Environment.getExternalStorageDirectory() +"/" + HatuonDb.NAME + ".db";
    if(!new File(outFile).exists()) {
        FileUtils.copyAssetsFile(getApplicationContext(), "db/hatuon.db", outFile);
    }
}
*/
}

使い方

// 項目名は、 Table名_item で自動生成してくれる
// select * from word where okCOunt = 0 and ngCount = 0
List list = SQLite.select().from(Word.class).where(Word_Table.okCount.eq(0)).and(Word_Table.ngCount.eq(0)).queryList();

// update word set ngCount = ngcount + 1, average = 50 where id = XXX
Word word = list.get(0);
word.ngCount = word.ngCount + 1;
word.average = 50;
word.save;

// count
int count = SQLite.selectCountOf().from(Word.class).count();

// in
List<String> wordList = Arrays.asList(sentence.split(" "));

List<HatuonKigou> words = new Select().from(HatuonKigou.class)
                                  .where(HatuonKigou_Table.word.in(wordList))
                                  .queryList();
Log2.e( new Select().from(HatuonKigou.class)
                     .where(HatuonKigou_Table.word.in(wordList))
                     .getQuery()
                     .toString());

// delete
String category = "sentence_5";
SQLite.delete().from(Sentence.class).where(Sentence_Table.category.eq(category)).async().execute();
     
// sort + count 
Sentence list = SQLite.select().from(Sentence.class)
                .where()
                .and(Sentence_Table.isWord.eq(isWord))
                .and(Sentence_Table.category.eq(category))
                .orderBy(Sentence_Table.average, true)
                .limit(30)
                .queryList();


詳しくは、こちら

ORM は、色々ありますが、すでに、開発が終了していたり、使うときにさらに別クラス宣言が必要だったり、
導入が面倒だったり、自動生成されるクラスが生成されなかったり、なんか良いのないのかと一生懸命
さがしました。realm も試しましたが、スキーマを静的に変えようとおもってもツールが見つから
なかったりと、そんななかで DbFlow を見つけました。
SQLite なら静的にスキーマを変えるツールもたくさんあるし、楽ちんです。

コードは、半減します。
ぜひお試しあれ

ただ、最大の欠点は、iOS 版が無いんですよね


// ex. dumpExtra(getIntent());
static private void dumpExtra(Intent intent) {
if (intent == null) {
Log.v("dumpExtra", "null");
return;
}
Bundle extras = intent.getExtras();
if (extras != null) {
Iterator<?> it = extras.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
Log.v("dumpExtra", "key: " + key);
}
}
}

祝 初パッド

ASUS MeMO Pad 7 ME572CL 購入

想像以上に使いやすい!

USB デバックで接続するには?

\android-sdk-windows\extras\google\usb_driver\android-sdk-windows\extras\google\usb_driver\android_winusb.inf

以下、追加

%SingleAdbInterface%        = USB_Install, USB\VID_0B05&PID_7773
%CompositeAdbInterface%     = USB_Install, USB\VID_0B05&PID_7773&REV_0232&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_0B05&PID_7773
%CompositeAdbInterface%     = USB_Install, USB\VID_0B05&PID_7773&REV_0232&MI_01

端末の設定->ソフトウェアバージョン->ビルド番号 何度かクリック


<HorizontalScrollView
android:id="@+id/horizontalScrollView1"
android:fadingEdgeLength="0dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

android:fadingEdgeLength=”0dp” 追加

© 2024 Falco Tech Blog Suffusion theme by Sayontan Sinha